=
「で割り当てることはできますが、と比較することはできません」の別の別の例==
は、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
2つのメモリ位置のバイトごとの比較を実行することに注意してください。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) { /* ... */ }