4
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);

答案是5131027。我不明白为什么会这样。任何人都可以帮助我理解这个概念。

4

2 回答 2

5

像这样投射指针不是一个好主意。

可能,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);
于 2013-10-25T04:46:51.857 回答
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是一种严格的别名违规。请参阅什么是严格的别名规则?有关严格别名规则的解释以及影响此类代码的其他因素的列表。

于 2013-10-25T04:51:39.600 回答