你怎么比较的两个实例的结构的平等标准。

有帮助吗?

解决方案

C没有提供任何语言设施 - 你必须自己做,并按成员比较每个结构成员。

其他提示

您可能想要使用 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() 担心填充,只要你不初始化 所有成员(立刻)。这由C90定义:

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

@格雷格是正确的那个必须写明确的比较功能在一般的情况。

它是能够使用 memcmp 如果:

  • 该结构包含没有浮点领域是可能的 NaN.
  • 该结构包含没有填充(使用 -Wpadded 与铛来检查)或结构明确将其初始化 memset 在初始化。
  • 没有部件的类型(例如Windows BOOL),具有不同但却等同的价值观。

除非你是编程为嵌入式系统(或编写库,可以用在他们身上),我不会担心一些情况,在C的标准。近与远指针的区别不存在任何32或64位设备。没有非嵌入式系统,我知道的多 NULL 指针。

另一种选择是来自动产生平等的功能。如果你把你的结构定义在一个简单的方法,能够利用简单的文字处理来处理简单的结构定义。你可以使用libclang的一般情况下–由于它采用相同的前端,作为铛,它处理所有角的情况下正确地(禁止bug).

我还没有看到这样的代码生成的图书馆。然而,这似乎比较简单。

然而,它也是这种情况,这样产生的平等职能往往会做错事情的应用水平。例如,应当两个 UNICODE_STRING 结构在Windows以比较肤浅或深?

这取决于你问的问题是:

  1. 这两个结构是同一个对象吗?
  2. 他们有相同的价值吗?
  3. 要确定它们是否是同一个对象,请将指向两个结构的指针进行比较。 如果您想要了解它们是否具有相同的值,则必须进行深入比较。这涉及比较所有成员。如果成员是指向其他结构的指针,则还需要递归到这些结构中。

    在结构不包含指针的特殊情况下,您可以使用memcmp对每个数据中包含的数据进行按位比较,而不必知道数据的含义。

    确保你知道'equals'对每个成员意味着什么 - 对于整数来说很明显,但在浮点值或用户定义的类型方面则更为微妙。

memcmp 不比较结构, 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,那么你可以将你的2个结构与memcmp进行比较,而且不用担心结构垃圾,这样你就可以赚取时间

此兼容示例使用Microsoft Visual Studio中的#pragma pack编译器扩展来确保结构成员尽可能紧密地打包:

#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))) {
    /* ... */
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top