另一个不同的例子是“你可以用 分配=
,但不能==
与struct
类型比较。
struct S {
int array[5];
};
struct S a = { { 1, 2, 3, 4, 5 } };
struct S b;
b = a; /* assignment ok */
if (b == a) { /* equality not ok */ }
那么我应该如何在条件下使用数组呢?
您可以使用memcmp
.
if (memcmp(b.array, a.array, sizeof(b.array)) == 0) { /* ... */ }
编辑:请注意,memcmp
执行两个内存位置的逐字节比较。正如 Eric 指出的那样,如果您的对象具有不同值的填充位,或者您的类型具有相同值的多个位表示,则memcmp
可能会产生误报。
在实践中,通过以标准化方式初始化对象(例如,在进行成员分配之前使用内存)memset
来避免这个问题。0
编辑: 即便如此,比较通过memcmp
仍可能产生假阴性。执行比较的最大可移植方式是将每个对应的成员相互比较。(点击链接了解血腥细节。)
您可以创建一个辅助函数来简化此操作:
/* API as memcmp, but memory treated like array of int, remainder bytes ignored */
int memcmp_int (const void *a, const void *b, size_t sz) {
const int *aa = a;
const int *bb = b;
while (sz >= sizeof(int)) {
if (*aa < *bb) return -1;
if (*aa > *bb) return 1;
++aa;
++bb;
sz -= sizeof(int);
}
return 0;
}
然后,可以非常简单地修改代码:
if (memcmp_int(b.array, a.array, sizeof(b.array)) == 0) { /* ... */ }