main(){
char i[2];
* i = 0;
* (i + 1) = 1;
printf("len = %d \n",sizeof(int *));
printf("i[0] = %d \n",*(int *)i);
}
答案不是16,答案是256 我使用的是turboc2.0,十六进制是100
答案 0 :(得分:3)
此代码取决于您的系统,特别是int的大小。
初始化后,您的i
数组如下所示:
------------
|0x00 | 0x01 |
------------
假设系统上的int
为32位:
将i
强制转换为*int
并解除引用时,将会访问四个字节(因为int
为32位或4个字节):
--------------------------
|0x00 | 0x01 | 0x?? | 0x?? |
--------------------------
因此,最后两个字节超出了数组的范围,将具有任何值,并且您将观察到未定义的行为(在我的系统上,实际上,每次执行代码时它都会打印不同的值,例如{{1 },1762656512
,...)。
在您的系统上假设-375848704
为16位,它会变得更加“更好”:
在这种情况下,当将int
转换为i
并将其解除引用时,这两个字节将作为16位值进行访问。但是,它仍然取决于endianess你得到的值:
Little endian:*int
Big endian:*(int*) i = 0x0100 = 256
所以,如果你期望*(int*) i = 0x0001 = 1
,你需要确保使用16位小端系统......
顺便说一句:将256
与sizeof()
一起使用时,请务必use the %zu
format specifier。