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”(除非我读错了)

这与反转字节顺序不同。术语endian通常是指以最高或最低有效字节在前存储的多字节值。

例如,十进制值 43981 以十六进制表示为ABCD。在big-endian中,最高有效字节 ( AB) 将存储在较低的内存位置,而最低有效字节 ( CD) 将存储在较高的内存位置。

little-endian中,顺序是相反的;最不重要的,其次是最重要的: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 回答