为什么memcmp返回-1虽然相等

the*_*ard 1 c arrays struct block memcmp

我正在使用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));
Run Code Online (Sandbox Code Playgroud)

seh*_*ehe 8

您可能正在读取不确定的值(单位化内存或覆盖的内存以包含未指定的数据).

例如,您可能正在访问非最后一次成员的工会成员.即使不这样做,最后写入的成员可能小于联合的总范围,导致超出该大小的"不确定"数据.

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

struct X a,b;
a.field1 = 'a';
b.field1 = 'a';
Run Code Online (Sandbox Code Playgroud)

你不能指望ab比较相等,因为你从来没有初始化所有的位(field2有更多的位超过field1)

---取决于未初始化内存的值,也会调用未定义的行为.---对于C11不适用

  • 这里没有未定义的行为.(1)将结构的地址传递给`memcmp`并不构成对其工会的访问成员.(2)访问最后存储成员以外的工会成员通常不是未定义的; 根据C 2011注释95,将根据第6.2.6条对字节进行重新解释.(3)将`memcmp`应用于任何对象可能会产生不需要的答案,但它不会"调用未定义的行为",即使内存未初始化也是如此. (5认同)
  • 访问一个不是最后写的联盟成员在C中完全没问题(只要你不违反其他约束); 但是,关于不同规模的工会成员的部分很重要; 特别是,写入较短的成员`field1`原则上可能使`field2`的所有字节无效,而不仅仅是它们共享的那些字节 (3认同)