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
。我不明白为什么会这样。任何人都可以帮助我理解这个概念。
像这样投射指针不是一个好主意。
可能,unsigned short
在您的机器上是 2 个字节,并且在转换之后,p->a
获取 value 0x0201
,即 decimal 513
,并p->b
获取 的 value 0x0403
,即 decimal 1027
。
请注意,在具有不同字节序的机器上,结果会有所不同。例如,在我的机器上,输出是258
( 0x0102
) 和772
( 0x0304
)。
另请注意,您应该使用格式说明符%u
来打印unsigned
类型的值:
printf("%u\t%u\n", p->a, p->b);
更新
这似乎是正在发生的事情......字符数组在内存中的布局如下:
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
是一种严格的别名违规。请参阅什么是严格的别名规则?有关严格别名规则的解释以及影响此类代码的其他因素的列表。