我正在使用memcmp()
两个相同结构的变量进行比较(结构中有结合)。
变量在两个数组中,我正在运行一个循环,每次迭代我memcmp(&arr1[i], &arr2[i], sizeof(arrtype))
。
调试时我发现memcmp返回-1,但是看两个变量及其值,我看到变量的值相等。这些数组在开始时使用memset归零。
memcmp
会返回-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));
答案 0 :(得分:8)
您可能正在阅读不确定值(单位化内存或覆盖的内存以包含未指定的数据)。
E.g。你可能正在访问一个非最后一个成员的工会成员。 即使不这样做,最后写入的成员可能小于联合的总范围,导致超出该大小的“不确定”数据。
struct X {
union {
char field1;
long long field2[10];
};
};
struct X a,b;
a.field1 = 'a';
b.field1 = 'a';
您不能指望a
和b
按位进行比较,因为您从未初始化所有位(field2
的位数超过{{1} }})
---取决于未初始化内存的值,也会调用未定义的行为.---对于C11不适用
答案 1 :(得分:4)
如果您使用的是结构,则您的成员字段之间可能存在填充字节。在开始使用之前,您可能会尝试memeset
整个结构为0.
答案 2 :(得分:2)
使用memcmp
比较两个对象可能会失败有三个原因:
struct
可能包含其值不受控制的填充字节。union
可能包含与最后存储的成员的字节不对应的字节(例如,其中一个较长成员的附加字节)。除非您已采取措施确保这些问题都不会影响通过memcmp
进行比较,否则比较两种结构的正确方法是逐个比较它们。