问题很简单。据我所知,在32位环境中,GCC认为char将按字节对齐,int将按4字节对齐。我也知道C99标准6.3.2.3规定,指针类型之间的强制转换导致未定义的操作。其他C标准对此有什么说法?这里还有许多经验丰富的编程人员——任何观点都将不胜感激。
int *iptr1, *iptr2;
char *cptr1, *cptr2;
iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;
问题很简单。据我所知,在32位环境中,GCC认为char将按字节对齐,int将按4字节对齐。我也知道C99标准6.3.2.3规定,指针类型之间的强制转换导致未定义的操作。其他C标准对此有什么说法?这里还有许多经验丰富的编程人员——任何观点都将不胜感激。
int *iptr1, *iptr2;
char *cptr1, *cptr2;
iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;
C语言只有一个标准(ISO标准),有两个版本(1989和1999),以及一些较小的修订。所有版本和修订都同意以下内容:
char*
可以寻址任何数据
void*
与char*
相同,但转换不需要类型转换int*
转换为char*
总是有效的,反之亦然char*
转换为int*
不能保证有效字符指针保证像这样工作的原因是,您可以将整数从内存中的任何位置复制到内存或磁盘的其他位置,反之亦然,这在低级编程中非常有用,例如图形库。
对于CPU来说,有大端和小端之分,因此结果是未定义的。例如,在将一个值为0x01234567的指针转换为char指针后,其值可能是0x12或0x67。
你可以尝试做:
iptr1 = atoi(cptr1); // val now = pointed by cptr1
cptr2 = atoi(iptr2); // val now = pointed by iptr2
这在DevCpp中对我有效!