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

16

问题很简单。据我所知,在32位环境中,GCC认为char将按字节对齐,int将按4字节对齐。我也知道C99标准6.3.2.3规定,指针类型之间的强制转换导致未定义的操作。其他C标准对此有什么说法?这里还有许多经验丰富的编程人员——任何观点都将不胜感激。

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

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

5
将int转换为char的操作总是可行的。反过来,对于某些CPU而言,这样的转换可以实现,而对于另一些CPU则不行。 - TonyK
如果您感兴趣,以下是一个特定案例的解析:https://dev59.com/B18e5IYBdhLWcg3wLYHt - Antonio
3个回答

13

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

  • 所有数据内存都是按字节寻址的,字符就是字节
  • 因此,char*可以寻址任何数据
    • void*char*相同,但转换不需要类型转换
  • int*转换为char*总是有效的,反之亦然
  • 将任意char*转换为int*不能保证有效

字符指针保证像这样工作的原因是,您可以将整数从内存中的任何位置复制到内存或磁盘的其他位置,反之亦然,这在低级编程中非常有用,例如图形库。


1
"void与char相同,但是它们之间的转换不需要类型转换,也不能进行加减操作。" - rsaxvc

4

对于CPU来说,有大端和小端之分,因此结果是未定义的。例如,在将一个值为0x01234567的指针转换为char指针后,其值可能是0x12或0x67。


0

你可以尝试做:

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

这在DevCpp中对我有效!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接