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

时间:2013-07-15 09:25:48

标签: c arrays struct block memcmp

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

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

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

    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));
    

3 个答案:

答案 0 :(得分:8)

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

E.g。你可能正在访问一个非最后一个成员的工会成员。 即使不这样做,最后写入的成员可能小于联合的总范围,导致超出该大小的“不确定”数据。

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

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

您不能指望ab按位进行比较,因为您从未初始化所有位(field2的位数超过{{1} }})

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

使用memcmp比较两个对象可能会失败有三个原因:

  1. struct可能包含其值不受控制的填充字节。
  2. union可能包含与最后存储的成员的字节不对应的字节(例如,其中一个较长成员的附加字节)。
  3. 类型可以具有相同的值,具有不同的表示形式(类型中的填充位,+ 0和-0的不同编码等)。
  4. 除非您已采取措施确保这些问题都不会影响通过memcmp进行比较,否则比较两种结构的正确方法是逐个比较它们。