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是一种严格的别名违规。请参阅什么是严格的别名规则?有关严格别名规则的解释以及影响此类代码的其他因素的列表。