如何比较标准C中两个相等的struct实例?


当前回答

如果结构只包含原语,或者如果你对严格的相等感兴趣,那么你可以这样做:

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不比较结构,memcmp比较二进制,结构中总是有垃圾,因此在比较中总是输出False。

逐个元素比较它是安全的,不会失败。

C语言没有提供这样做的语言工具——你必须自己做,并逐个比较每个结构成员。

这个兼容的例子使用了来自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来逐个比较每个结构中包含的数据,而不必知道这些数据的含义。

确保你知道' = '对于每个成员意味着什么——这对于整型来说很明显,但对于浮点值或用户定义的类型来说就更微妙了。

如果你经常这样做,我建议你写一个函数来比较这两种结构。这样,如果你改变了结构,你只需要改变一个地方的比较。

至于怎么做....您需要单独比较每个元素