2

割り当てのためにバイトを交換しようとしていますが、これがその方法だと思いました。

p は反転するスカラー オブジェクトを指します。 size はオブジェクトのバイト数です。

void *ReverseEndian(void *p, size_t size) 
{
    char *head = (char *)&p;
    char *tail = head + size - 1;

    for (; tail > head; --tail, ++head) {
        char temp = *head;
        *head = *tail;
        *tail = temp;
    }
    return p;
}

上記の彼に明らかに何か問題がありますか?教授のテスト コードでエラーが発生します。

#define TestIt(a, b) TestReverse((void *)&(a),\
                     ReverseEndian((void *)&(b), sizeof(b)), sizeof(b))


int main()
char ch = 0x01, ch1 = ch;
   short sh = 0x0123, sh1 = sh;
   long lo = 0x01234567, lo1 = lo;
   float fl = 1234.567e27F, fl1 = fl;
   double db = 123456.567890, db1 = db;
   long double ld = 987654.321053e-204L, ld1 = ld;
   void *vp = (void *)0x0123, *vp1 = vp;
   char *cp = (char *)0x4567, *cp1 = cp;
   char *ip = (char *)0x89AB, *ip1 = ip;

   TestIt(ch1, ch);
   TestIt(sh1, sh);
   TestIt(lo1, lo);
   TestIt(fl1, fl);
   TestIt(db1, db);
   TestIt(ld1, ld);
   TestIt(vp1, vp);
   TestIt(cp1, cp);
   TestIt(ip1, ip);

   printf("ReverseEndian succeeded!\n");

   return EXIT_SUCCESS;
}

void TestReverse(const void *before, const void *after, size_t size)
{
   const char *cpBfore = (const char *)before;
   const char *cpAfter = (const char *)after;
   const char *tail;

   for (tail = cpBfore + (size - 1); size; --size)
      if (*tail-- != *cpAfter++)
      {
         fprintf(stderr, "ReverseEndian failed!\n");
         exit(EXIT_FAILURE);
      }
}
4

4 に答える 4

4

ここ

char *head = (char *)&p;

別のポインターを指すポインターを定義しています。したがって、ポインタ->ポインタ->バイトがありますが、これは明らかにあなたが望むものではありません。幸運なことに、プログラムはクラッシュしませんでした。

char *head = (char *)p;が指すメモリから各バイトが読み取られるようにする必要がありますp

于 2010-02-24T06:39:47.783 に答える
2

pはポインタ変数(つまり、何かのメモリアドレスを保持する変数)であり、次の行にあります。

char *head = (char *)&p;

...を使用しています。これは、ポインタ変数に含まれる(指す)メモリアドレス値&pではなく、ポインタ変数自体のアドレスを提供します。

代わりにこれを行うつもりでしたか?

char *head = (char *)p;

ちなみに、ソースコードは文字列全体の順序を逆にしているように見えます(例: "Hello"-> "olleH"(間違って読んでいない限り))

これは、エンディアンを逆転させることと同じではありません。エンディアンという用語は通常、最上位または最下位のバイトが最初に格納されるマルチバイト値を指します。

例として、10進値43981は16進数で。として表されABCDます。ビッグエンディアンでは、最上位バイト(AB)は下位メモリ位置に格納され、最下位バイト(CD)は上位メモリ位置に格納されます。

リトルエンディアンでは、順序が逆になります。最下位の後に最上位が続く:CDAB

于 2010-02-24T06:45:21.597 に答える
1

char *head = (char *)&pする必要がありますchar *head = (char *)p

于 2010-02-24T06:39:01.797 に答える
1

p のアドレスを取得するべきではありません

これはうまくいくはずです:

void *ReverseEndian(void *p, size_t size) 
{
    char *head = (char *)p; // here
    char *tail = head + size - 1;

    for (; tail > head; --tail, ++head) {
        char temp = *head;
        *head = *tail;
        *tail = temp;
    }
    return p;
}
于 2010-02-24T11:33:57.480 に答える