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


当前回答

你不能使用memcmp来比较结构是否相等,因为在结构的字段之间存在潜在的随机填充字符。

  // bad
  memcmp(&struct1, &struct2, sizeof(struct1));

对于这样的结构体,上述方法将失败:

typedef struct Foo {
  char a;
  /* padding */
  double d;
  /* padding */
  char e;
  /* padding */
  int f;
} Foo ;

为了安全起见,您必须使用成员比较。

其他回答

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

注意,可以在非静态结构上使用memcmp() 担心填充,只要你没有初始化 所有成员(同时)。这是C90定义的:

http://www.pixelbeat.org/programming/gcc/auto_init.html

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

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个结构,不用担心结构垃圾,这将让你赚到时间

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

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