
344
|
第九章
比較位元組
類似於
strcmp()
,
memcmp()
可用於比較兩個記憶體團塊是否相等:
#include <string.h>
int memcmp (const void *s1, const void *s2, size_t n);
此函式會比較
s1
與
s2
之頭
n
個位元組。如果這兩個記憶體區塊相等,則傳回
0
;如果
s1
小於
s2
,則傳回小於零的值;如果
s1
大於
s2
,則傳回大於零的值。
同樣的,BSD 也提供了一個現在已廢棄的介面,用以執行大致相同的工作:
#include <strings.h>
int bcmp (const void *s1, const void *s2, size_t n);
bcmp()
會比較
s1
與
s2
之頭
n
個位元組。如果這兩個記憶體區塊相等,則傳回
0
;如果
它們有所不同,則傳回非零值。
因為結構會遭到補白(見第 9 章〈其他的對齊議題〉一小節),所以經由
memcmp()
或
bcmp()
比較兩個結構是否相等並不可靠。一個結構的兩個實例會因為補白中包含未初始
設定的垃圾而導致不相等。因此,如下的程式碼並不安全:
/* 比較兩艘船是否相同?(不安全) */
int compare_dinghies (struct dinghy *a, struct dinghy *b)
{
return memcmp (a, b, sizeof (struct dinghy));
}
事實上,想要比較兩個結構的程式設計者,應該比較兩個結構中每個成員。此類做法可
以經過優化,但所花的功夫絕對會比不安全的 ...