c语言打印中的投射指针差异
以代码为例:c语言打印中的投射指针差异,c,pointers,casting,C,Pointers,Casting,以代码为例: int main() { char orange[5]; for (int i = 0; i < 5; i++) orange[i] = 1; printf("orange: %d\n", *((char *)orange)); printf("orange: %d\n", *((int *)orange)); return 0; } intmain(){ 焦橙[5]; 对于(int i=0;i
int main() {
char orange[5];
for (int i = 0; i < 5; i++)
orange[i] = 1;
printf("orange: %d\n", *((char *)orange));
printf("orange: %d\n", *((int *)orange));
return 0;
}
intmain(){
焦橙[5];
对于(int i=0;i<5;i++)
橙色[i]=1;
printf(“橙色:%d\n”,*((字符*)橙色));
printf(“橙色:%d\n”,*((int*)橙色));
返回0;
}
第一条print语句给我的值是1
,但第二条print语句给我的值是16843009
。差异的原因是什么?在第二个示例中,您将一些相邻的char
值别名为int
。根据C标准,这是未定义的;然而,一个常见的结果是,您将得到int
的值,该值的位模式与那些连接的char
值的位模式相同
在这种情况下,您看到的值是十进制形式的0x01010101
它是未定义的行为,因为C99 6.5#7列出了可能存在别名的有效类型组合,并且char
asint
不在列表中。(您可以将int
别名为char
,但不能反过来)。获取标准文本
由于对齐要求,还存在潜在的未定义行为。例如,一些系统要求只能在4的倍数的地址访问
int
在第二种情况下,您将其强制转换为int
指针。因此,假设系统上的int
为4
字节,执行*((int*)橙色)
将访问4
字节,从orange[0]
到orange[3]
由于您在这些地址中都有
1
,orange[0]
到orange[3]
的十六进制表示法将是0x01010101
,即十进制的16843009
。首先您必须知道int是4字节的数量,char是1字节的。
当机器读取整数时,它将连续读取4个字节。并读取字符的1字节。
在本例中,首先声明一个orange[5]数组,它是计算机上连续的5个字节。每个字节分配1。所以你会在你的机器上得到这样的东西
0000 0001 0000 0001 0000 0001 0000 0001 0000 0001
变量orange是指向第一个字节的指针。如果您将橙色强制转换为char*
并取消引用,机器将尝试读取此地址(橙色)上的字符,因此您将获得
0000 0001
如果您将orange转换为int指针,机器将尝试读取从orange开始的4个字节,因此您将得到这个结果
0000 0001 0000 0001 0000 0001 0000 0001
如果您将这个二进制数转换为十进制数,您将得到16843009
希望有帮助:)我猜第二条语句是将整个列表作为一个大整数处理。因此它可能将橙色视为一个长二进制数。嗨@Matt,我不明白为什么它是未定义的行为。如果你能解释一下或者给我一些资源来阅读,那就太好了。好的,我明白了。谢谢@Matt。