如何比较标准C中两个相等的struct实例?
当前回答
您可能会尝试使用memcmp(&a, &b, sizeof(struct foo)),但它可能不是在所有情况下都有效。编译器可以向结构体添加对齐缓冲空间,并且在位于缓冲空间的内存位置上找到的值不保证是任何特定的值。
但是,如果在使用结构之前使用calloc或memset结构的完整大小,则可以与memcmp进行浅比较(如果结构包含指针,则只有在指针指向的地址相同时才匹配)。
其他回答
你不能使用memcmp来比较结构是否相等,因为在结构的字段之间存在潜在的随机填充字符。
// bad
memcmp(&struct1, &struct2, sizeof(struct1));
对于这样的结构体,上述方法将失败:
typedef struct Foo {
char a;
/* padding */
double d;
/* padding */
char e;
/* padding */
int f;
} Foo ;
为了安全起见,您必须使用成员比较。
您可能会尝试使用memcmp(&a, &b, sizeof(struct foo)),但它可能不是在所有情况下都有效。编译器可以向结构体添加对齐缓冲空间,并且在位于缓冲空间的内存位置上找到的值不保证是任何特定的值。
但是,如果在使用结构之前使用calloc或memset结构的完整大小,则可以与memcmp进行浅比较(如果结构包含指针,则只有在指针指向的地址相同时才匹配)。
如果结构只包含原语,或者如果你对严格的相等感兴趣,那么你可以这样做:
int my_struct_cmp(const struct my_struct * lhs, const struct my_struct * rhs) { return memcmp(lhs, rsh, sizeof(struct my_struct)); }
然而,如果你的结构体包含指向其他结构体或联合的指针,那么你就需要编写一个函数来正确地比较原语,并根据需要对其他结构进行比较调用。
但是请注意,您应该使用memset(&a, sizeof(struct my_struct), 1)来将结构体的内存范围归零,这是ADT初始化的一部分。
如果你经常这样做,我建议你写一个函数来比较这两种结构。这样,如果你改变了结构,你只需要改变一个地方的比较。
至于怎么做....您需要单独比较每个元素
如果这2个结构变量是用calloc初始化的,或者它们被memset设置为0,这样你就可以用memcmp比较你的2个结构,不用担心结构垃圾,这将让你赚到时间
推荐文章
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- C“int”的大小是2字节还是4字节?
- 多维数组如何在内存中格式化?
- printf()和puts()在C语言中的区别是什么?
- 断言是邪恶的吗?
- 有效,但毫无价值的语法在开关情况下?
- 有一个好的Valgrind Windows的替代品吗?
- gcc在哪里查找C和c++头文件?
- 什么时候使用Struct vs. OpenStruct?
- 为什么x == (x = y)和(x = y) == x不一样?
- c++中size_t和int的区别是什么?
- 在C和c++中静态变量存储在哪里?
- errno线程安全吗?
- 如何在C程序中获取当前目录?
- 互斥实例/教程?