#include <stdio.h>
int main(void){
unsigned a[3][4] = {
{2,23,6,7},
{8,5,1,4},
{12,15,3,9}
};
printf("%u",*((int*)(((char*)a)+4)));
return 0;
}
我的机器的输出是a[0][1]
i.e 23.有人可以解释一下这是如何工作的吗?
编辑:回滚到旧版本yucky
代码,正是呈现给我的内容:P
所以你的数组在内存中如下:
2, 23, 6, 7, 8...
它的作用是将数组转换为char*
,它允许您访问各个字节,它指向这里:
2, 23, 6, 7, 8...
^
然后它添加四个字节,将其移动到下一个值(稍后会详细介绍)。
2, 23, 6, 7, 8...
^
然后它把它变成一个int*
并取消引用它,得到值 23。
从技术上讲,这段代码存在三个问题。
首先是它假设unsigned
大小为 4 个字节。 (因此+ 4
)。但这不一定是真的!更好的是+ sizeof(unsigned)
,无论大小如何都确保正确性unsigned
恰好是。
第二个问题是演员int
: 原来的数组是unsigned
,但该值被转换为int
。中存在值unsigned
范围为int
不能代表(因为在int
范围的一半是负数。)因此,如果数组中的某个值不能表示为int
(意味着该值大于INT_MAX
),你会得到错误的值。更好的是转换为unsigned*
,保持正确的类型。
最后一件事是格式说明符。整数的说明符是%d
,但代码使用%u
,适用于无符号整数。实际上,即使投射回int*
错了,printf
将要投射that值返回到unsigned*
,恢复其完整性。通过解决第二个问题,第三个问题就会自行解决。
有一个hidden第四个问题:代码很糟糕。这可能是为了学习目的,但是yuck.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)