如何比较标准C中两个相等的struct实例?
当前回答
你不能使用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初始化的一部分。
这取决于你问的问题是:
这两个结构体是同一个对象吗? 它们的价值相同吗?
要确定它们是否是同一个对象,可以比较指向这两个结构体的指针是否相等。 如果你想从总体上找出它们是否具有相同的值,你必须进行深入的比较。这涉及比较所有成员。如果成员是指向其他结构的指针,你也需要递归到这些结构中。
在结构不包含指针的特殊情况下,您可以执行memcmp来逐个比较每个结构中包含的数据,而不必知道这些数据的含义。
确保你知道' = '对于每个成员意味着什么——这对于整型来说很明显,但对于浮点值或用户定义的类型来说就更微妙了。
如果这2个结构变量是用calloc初始化的,或者它们被memset设置为0,这样你就可以用memcmp比较你的2个结构,不用担心结构垃圾,这将让你赚到时间
如果你经常这样做,我建议你写一个函数来比较这两种结构。这样,如果你改变了结构,你只需要改变一个地方的比较。
至于怎么做....您需要单独比较每个元素
memcmp不比较结构,memcmp比较二进制,结构中总是有垃圾,因此在比较中总是输出False。
逐个元素比较它是安全的,不会失败。
推荐文章
- C多行宏:do/while(0) vs作用域块
- time_t最终的类型定义是什么?
- 我需要显式处理负数或零时,总和平方数字?
- 函数名周围的括号是什么意思?
- 用C语言创建自己的头文件
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- main()中的Return语句vs exit()
- 如果不是内存地址,C指针到底是什么?
- 我如何在Visual Studio中预处理后看到C/ c++源文件?
- 保护可执行文件不受逆向工程的影响?
- 从C语言的函数返回一个struct
- C99 'restrict'关键字的实际用法?
- 检查子字符串存在于C中的字符串中
- 从标准输入中捕获字符,而不需要等待按enter键
- 查找当前可执行文件的路径,不包含/proc/self/exe