将一个int指针转换为char ptr,反之亦然

时间:2010-11-27 09:55:26

标签: c pointers types casting c89

问题很简单。据我了解,GCC坚持认为字符将是字节对齐的,并且在32位环境中对齐4字节对齐。我也知道C99标准6.3.2.3,它表示在未对齐的指针类型之间进行转换会导致未定义的操作。 C的其他标准对此有何评论?这里也有许多经验丰富的编码员 - 对此的任何看法都将受到赞赏。

int *iptr1, *iptr2;
char *cptr1, *cptr2;

iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;

3 个答案:

答案 0 :(得分:12)

C只有一个标准(ISO标准),有两个版本(1989年和1999年),还有一些非常小的版本。所有版本和修订都同意以下内容:

  • 所有数据存储器都是字节可寻址的,字符是字节
  • 因此char*将能够处理任何数据
    • void*char*相同,除了与其进行的转换不需要类型转换
  • int*转换为char*始终有效,转而回int*
  • 无法保证将char*转换为int*

保证char指针的工作原理是这样的,例如,您可以将内存中的任何整数复制到内存或磁盘中的其他位置,然后返回,这在以下内容中非常有用。低级编程,例如图形库。

答案 1 :(得分:4)

CPU有big-endian和little-endian,因此结果未定义。 例如,对于转换后的char指针,0x01234567的值可能是0x12或0x67。

答案 2 :(得分:0)

您可以尝试:

iptr1 = atoi(cptr1); // val now = pointed by cptr1
cptr2 = atoi(iptr2); // val now = pointed by iptr2

这在DevCpp中对我有用!