C中的指针,不明白他们是如何得到这个结果的

时间:2014-01-16 12:58:32

标签: c pointers casting

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

1 个答案:

答案 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位小端系统......

顺便说一句:将256sizeof()一起使用时,请务必use the %zu format specifier