2

我正在使用memcmp()相同结构的两个变量进行比较(结构中有联合)。变量在两个数组中,我正在运行一个循环,每次迭代我都会这样做memcmp(&arr1[i], &arr2[i], sizeof(arrtype))

调试时,我看到 memcmp 返回 -1,但查看两个变量及其值,我发现变量具有相等的值。这些数组在开始时用 memset 清零。

  1. 那么有人知道为什么memcmp返回-1而不是0吗?
  2. 有没有更好的方法来做我需要的事情(比较两个内存块)?

代码:

typedef struct type1 {
    int version;
    union {
            option1_t opt1;
            option2_t opt2;
    } union_t;
} type1_t;

typedef struct type0 {
    type1_t member1;
    type2_t member2;
    type3_t member3;
    type4_t member4;
    type5_t member;
} type0_t;


type0_t arr1[SIZE];
type0_t arr2[SIZE];

memset(arr1, 0, SIZE * sizeof(type0_t));
memset(arr2, 0, SIZE * sizeof(type0_t));

/* doing irrelevant stuff... */

/* get values into arr1, arr2 ... */


/* comparing both arrays in for loop*/
value = memcmp(&arr1[i], &arr2[i], sizeof(type0_t));
4

3 回答 3

9

您可能正在读取不确定的值(未初始化的内存,或被覆盖的内存以包含未指定的数据)。

例如,您可能正在访问不是最后写入成员的工会成员。即使您不这样做,最后写入的成员也可能小于联合的总范围,从而导致超出该大小的“不确定”数据。

struct X { 
    union {
         char field1;
         long long field2[10];
    };
};

struct X a,b;
a.field1 = 'a';
b.field1 = 'a';

您不能期望a并按b位比较相等,因为您从未首先初始化所有位(field2超过更多位field1

---取决于未初始化内存的值,也会调用未定义的行为。--- C11 不正确

于 2013-07-15T09:31:03.480 回答
4

如果您使用的是结构,则成员字段之间可能会有填充字节。memeset在开始使用之前,您可能会尝试将整个结构设置为 0。

于 2013-07-15T09:28:13.933 回答
2

用于memcmp比较两个对象可能会因以下三个原因而失败:

  1. Astruct可能包含其值不受控制的填充字节。
  2. Aunion可能包含与最后存储的成员的字节不对应的字节(例如,联合的较长成员之一的附加字节)。
  3. 类型可能具有不同表示的相同值(类型内的填充位,+0 和 –0 的不同编码,等等)。

除非您已采取措施确保这些问题都不会影响比较 via memcmp,否则比较两个结构的正确方法是逐个成员比较它们。

于 2013-07-15T13:08:31.073 回答