次の C コードを作成して、メモリの 2 つの領域を比較し、それらが同一かどうかを確認しました。
#include <stdio.h>
struct s1 {
int a, b;
char c;
} s1;
int memcmpwannabe(void* value1, void *value2, int size1, int size2) {
if(size1 != size2)
return -1;
if(size1 == 0 || size2 == 0)
return -1;
//memcmp() wannabe
char *p1 = value1;
char *p2 = value2;
int sz = size1;
do {
if(*p1 != *p2)
break;
else
p1++, p2++;
}
while(--sz != 0);
if(sz == 0)
return 0;
return -1;
}
int main() {
struct s1 v1;
struct s1 v2;
v1.a = 1;
v1.b = 2;
v1.c = 'a';
v2.a = 1;
v2.b = 2;
v2.c = 'a';
int res = memcmpwannabe((void*) &v1, (void*) &v2, sizeof(s1), sizeof(s1));
printf("Res: %d\n", res);
}
構造は同じですが、とにかく -1 を返します。いくつかのデバッグの後、char 変数の後の 3 つのパディング バイトが、予想していたゼロではなく、ランダム データで埋められていることがわかりました。
これと、それを可能な限り汎用的に保ちたいという事実を知っているので(引数として void* を使用して)、誰かが別のバイト対バイト比較を教えてくれますか?
(誰かが尋ねる前に、私はカスタム memcmp() を書いています。なぜなら、いくつかの実装では違いの後に続くからです