【发布时间】:2016-10-14 02:52:24
【问题描述】:
我正在使用一个包含许多成员的大型结构,我想要一种简单的方法来快速查看是否有任何成员非零。我知道 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));
【问题讨论】:
-
注意:
double fn = -0.0; fp = 0.0;-->fn == fp,两者都等于零。然而memcmp(&fp, &fn, sizeof fp)报告了差异。 -
不要把
MyInts EmptyStruct = {0};指定为将填充初始化为零位。 -
@chux 保证将填充设置为零位,请参阅 C11 6.7.9/10(和 /21 指回 /10)
-
@M.M 感谢您的引用。
-
如果你的系统有
memcchr,应该比memcmp效率更高。