struct check{
unsigned short a;
unsigned short b;
};
static unsigned char v[5] = {1,2,3,4,5};
struct check *p = (struct check *)v;
printf("%d",p->a);
printf("\t%d",p->b);
答案是513
和1027
。我无法理解为什么会发生这种情况。任何人都可以帮助我理解这个概念。
答案 0 :(得分:5)
像这样投射指针不是一个好主意。
您的计算机上unsigned short
可能是2个字节,在投射后,p->a
获得值0x0201
,即小数513
和p->b
获取0x0403
的值,即十进制1027
。
请注意,在具有不同endianess的计算机上,结果会有所不同。例如,在我的计算机上,输出为258
(0x0102
)和772
(0x0304
)。
另请注意,您应使用格式说明符%u
来打印unsigned
类型的值:
printf("%u\t%u\n", p->a, p->b);
答案 1 :(得分:3)
<强>更新强>
这是正在发生的事情......字符数组在内存中按如下方式排列:
v+0: 0x01
v+1: 0x02
v+2: 0x03
v+3: 0x04
v+4: 0x05
当您将v
转换为类型struct check *
并取消引用时,此内存区域将按以下方式重新解释:
p->a: 0x0201 (v+1, v+0)
p->b: 0x0403 (v+3, v+2)
十六进制的 0x0201
等于513,0x0403
等于1027.
其他想法......
请务必注意,您无法保证代码的行为。对于初学者,解除引用p
是一种严格的别名违规行为。有关严格别名规则的说明以及影响此类代码的其他因素列表,请参阅What is the strict aliasing rule?。