我正在使用一个包含许多成员的大型结构,我想要一种简单的方法来快速查看是否有任何成员非零。我知道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));
答案 0 :(得分:0)
在一般情况下你不能这样做,因为结构可以在字段之间和结构的末尾有填充,并且pad字节的内容不被保证(可能是未初始化的垃圾)
如果比较的两个结构最初分配了calloc
,或者在填写实际值之前将sizeof(thestruct)
字节memset
归零,那么填充将具有可预测的值,memcmp
将起作用。同样,如果你可以保证没有填充,那么这个memcmp
就可以了。但是,如果其中一个可能没有被归零,那么不安全。
当然,如果你想成为" nice",你可以直接比较成员,可能是在一个factored out函数中,让编译器处理优化,而不用担心你是否有非零结构填充浮动。
注意:您提供的链接上的here涵盖了这一点。对该答案的评论也注意到一些边缘情况,例如: float
s可以具有相等但具有不同位表示的值,因此即使如此,它也不能推广到所有结构。
答案 1 :(得分:0)
我决定继续根据评论回答我自己的问题。正如@ M.M所提到的,填充不能保证由结构赋值保留,也可能不被单个成员赋值保留。因此,使用memcmp
检查非零成员的结构是不安全的。
执行此操作的安全方法,如ShadowRanger suggests,将分别比较每个结构成员。