将int指针强制转换为char ptr,反之亦然
问题很简单。据我所知,GCC认为在32位环境中,字符将是字节对齐的,整数将是4字节对齐的。我还了解C99标准6.3.2.3,其中指出在未对齐指针类型之间进行转换会导致未定义的操作。C的其他标准对此怎么说?这里也有许多经验丰富的程序员-对此有任何看法都将不胜感激将int指针强制转换为char ptr,反之亦然,c,pointers,types,casting,c89,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; CPU有big-endian和little-endian,
int *iptr1, *iptr2;
char *cptr1, *cptr2;
iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;
CPU有big-endian和little-endian,因此结果是未定义的。
例如,对于强制转换后的字符指针,0x01234567的值可以是0x12或0x67。C只有一个标准(ISO的标准),有两个版本(1989和1999),加上一些非常小的修订。所有版本和修订版均同意以下内容:
- 所有数据存储器都是字节可寻址的,字符是字节
- 因此,
将能够处理任何数据char*
与void*
相同,只是它之间的转换不需要类型转换char*
- 从
转换到int*
总是有效的,就像转换回char*
int*
- 将任意
转换为char*
不能保证有效int*
iptr1 = atoi(cptr1); // val now = pointed by cptr1
cptr2 = atoi(iptr2); // val now = pointed by iptr2
这在DevCpp中对我有用 从int*到char*的转换总是有效的。另一方面,在某些CPU上它工作,而在其他CPU上则不工作。如果您感兴趣,下面将检查一个特定的情况:“void*与char*相同,只是与之之间的转换不需要类型转换”-也不能添加/减去它们。