2

次の 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() を書いています。なぜなら、いくつかの実装では違いの後に続くからです

4

1 に答える 1

3

これを知っており、可能な限り一般的に保ちたいという事実を知っています(したがって、引数として void* を使用します

ポインターだけを取得する場合void *、定義上、オブジェクトの内部構成については何もわかりません。つまり、バイトの意味について何も知らないことを意味します (「実際の」メンバーにあり、非表示のパディングのみのメンバーにあります)。

これは、標準の C で簡単にできることではないと思います。

于 2015-03-05T15:23:00.630 に答える