memcmp为相同(零值)位域结构返回非零值

时间:2018-02-07 02:34:10

标签: c++ c

在比较值中包含0的两个位域结构时,我看到了memcmp的意外输出。 memcmp在输出中返回非零结果。

这是否意味着比特位域不会引用可以保留任何东西?如果是这样(导致memcmp不可靠)比较包含位字段的任何内容的最佳方法是什么?我可以拥有自己的类或类型字段结构。

struct bitStruct{
    int b:4;
};
int test() 
{
    bitStruct s = {0};
    bitStruct zero = {0};
    cout << memcmp(&s, &zero, sizeof(s)); // this memcmp returns non-zero.
    return 0;
}

1 个答案:

答案 0 :(得分:5)

可能涉及填充。 memcmp只会比较sizeof(s)字节,就是这样。如果涉及填充,结果将不会像您期望的那样,因为结构的未命名成员将处于不确定的阶段。比较不会产生相同的结果。您可以使用sizeof(结构类型)memset结构实例,这将在此方案中产生正确的结果。

在这种情况下你可以完美无缺地做的就是比较那个位域而不是整个结构实例。