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

标签 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));

最佳答案

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

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

当然,如果您想变得“友善”,您可以直接比较成员(可能是在分解函数中),然后让编译器处理优化,而不必担心是否有未清零的结构且填充 float 。

注:The second highest voted answer您提供的链接涵盖了这一点。该答案的评论还指出了一些边缘情况,例如float 可以具有比较相等但具有不同位表示形式的值,因此即使如此,它也不能推广到所有结构。

关于我可以使用 memcmp 检查结构中的非零成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40034162/

相关文章:

c - K&R 练习 1.16 - 线长限制

c - fread() 从二进制文件读取时出现意外行为

c - 如何有效地将一 block 内存与单个字节进行比较?

c - 我在 '=' token 之前收到以下错误 : expected ',' , ';' 、 'asm' 、 '__attribute__' 或 '{' 。我如何解决它?

c++ - 在 clang 编译的 Termux 中运行 C 代码

c - 在 C 中破坏结构的最佳方法是什么

c - 为什么 memcmp 比 for 循环检查快得多?

c - 为什么初始数组元素的地址比较相等?

c - C-使用read()和write()从一个文件复制到另一个文件,而不使用文件功能

c - 在 C 中写入指针数组