16

问题很简单。据我了解,GCC 认为 chars 在 32 位环境中是字节对齐的,ints 是 4 字节对齐的。我也知道 C99 标准 6.3.2.3 说在未对齐的指针类型之间进行转换会导致未定义的操作。C 的其他标准对此有何评论?这里也有许多经验丰富的编码人员 - 对此的任何看法将不胜感激。

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

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

3 回答 3

13

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

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

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

于 2010-11-30T20:48:22.843 回答
4

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

于 2010-11-27T10:31:12.737 回答
0

您可以尝试这样做:

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

这在 DevCpp 中对我有用!

于 2013-02-16T11:39:34.130 回答