我正在使用同一结构的两个变量(结构中有union)进行比较。
变量在两个数组中,我运行一个循环,每次迭代都在这里进行memcmp()
在调试时,我看到memcmp返回-1,但是查看这两个变量及其值,我看到这些变量的值是相等的这些数组在开头用memset置零。
那么有人知道为什么memcmp(&arr1[i], &arr2[i], sizeof(arrtype))返回-1而不是0吗?
有没有更好的方法来做我需要的事情(比较两个内存块)?
代码:

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

最佳答案

您可能正在读取不确定的值(单元化内存,或内存被覆盖以包含未指定的数据)。
你可以访问一个不是上次写入的成员的工会成员。
即使没有,最后写入的成员也可能小于联合的总范围,从而导致超出该大小的“不确定”数据。

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

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

你不能期望ab按位比较,因为你从来没有初始化过所有的位(field2有更多的位超过field1
---根据未初始化内存的值,还调用未定义的行为。---对于C11不为true

关于c - 为什么memcmp返回-1尽管相等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17650823/

10-11 23:04