如何比较标准C中两个相等的struct实例?
当前回答
如果这2个结构变量是用calloc初始化的,或者它们被memset设置为0,这样你就可以用memcmp比较你的2个结构,不用担心结构垃圾,这将让你赚到时间
其他回答
C语言没有提供这样做的语言工具——你必须自己做,并逐个比较每个结构成员。
memcmp不比较结构,memcmp比较二进制,结构中总是有垃圾,因此在比较中总是输出False。
逐个元素比较它是安全的,不会失败。
这个兼容的例子使用了来自Microsoft Visual Studio的#pragma包编译器扩展,以确保结构成员尽可能紧密地打包:
#include <string.h>
#pragma pack(push, 1)
struct s {
char c;
int i;
char buffer[13];
};
#pragma pack(pop)
void compare(const struct s *left, const struct s *right) {
if (0 == memcmp(left, right, sizeof(struct s))) {
/* ... */
}
}
你不能使用memcmp来比较结构是否相等,因为在结构的字段之间存在潜在的随机填充字符。
// bad
memcmp(&struct1, &struct2, sizeof(struct1));
对于这样的结构体,上述方法将失败:
typedef struct Foo {
char a;
/* padding */
double d;
/* padding */
char e;
/* padding */
int f;
} Foo ;
为了安全起见,您必须使用成员比较。
如果结构只包含原语,或者如果你对严格的相等感兴趣,那么你可以这样做:
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初始化的一部分。