我可以使用memcmp检查非零成员的结构吗?

时间:2016-10-14 02:52:24

标签: c struct memcmp

我正在使用一个包含许多成员的大型结构,我想要一种简单的方法来快速查看是否有任何成员非零。我知道memcmp()不应该用于比较两个结构的相等性(如下所述:How do you compare structs for equality in C?),但我希望通过将结构与已设置为0的内存块进行比较,这可能会奏效。

例如,假设我有一些结构:

typedef struct {
    int Int1;
    int Int2;
    int Int3;
} MyInts;

我从这个结构创建一个变量:

MyInts MyStruct = {0};

在我的程序执行过程中,MyStruct的成员通常为0,但有时可能会暂时设置为某个非零值。我想快速检查MyStruct中的任何一个整数是否为非零。我可以使用memcmp(),如下所示吗?

// Create empty struct to test against
MyInts EmptyStruct = {0};

// Make sure entire memory block of test struct is cleared
memset(&EmptyStruct, 0, sizeof(MyInts));

// Compare MyStruct to EmptyStruct to see if any non-zero members exist
int result = memcmp(&MyStruct, &EmptyStruct, sizeof(MyInts));

2 个答案:

答案 0 :(得分:0)

在一般情况下你不能这样做,因为结构可以在字段之间和结构的末尾有填充,并且pad字节的内容不被保证(可能是未初始化的垃圾)

如果比较的两个结构最初分配了calloc,或者在填写实际值之前将sizeof(thestruct)字节memset归零,那么填充将具有可预测的值,memcmp将起作用。同样,如果你可以保证没有填充,那么这个memcmp就可以了。但是,如果其中一个可能没有被归零,那么不安全。

当然,如果你想成为" nice",你可以直接比较成员,可能是在一个factored out函数中,让编译器处理优化,而不用担心你是否有非零结构填充浮动。

注意:您提供的链接上的here涵盖了这一点。对该答案的评论也注意到一些边缘情况,例如: float s可以具有相等但具有不同位表示的值,因此即使如此,它也不能推广到所有结构。

答案 1 :(得分:0)

我决定继续根据评论回答我自己的问题。正如@ M.M所提到的,填充不能保证由结构赋值保留,也可能不被单个成员赋值保留。因此,使用memcmp检查非零成员的结构是不安全的。

执行此操作的安全方法,如ShadowRanger suggests,将分别比较每个结构成员。