指针在不同数据类型中的行为

时间:2013-10-25 04:41:55

标签: c pointers struct

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。我无法理解为什么会发生这种情况。任何人都可以帮助我理解这个概念。

2 个答案:

答案 0 :(得分:5)

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

您的计算机上unsigned short可能是2个字节,在投射后,p->a获得值0x0201,即小数513p->b获取0x0403的值,即十进制1027

请注意,在具有不同endianess的计算机上,结果会有所不同。例如,在我的计算机上,输出为2580x0102)和7720x0304)。

另请注意,您应使用格式说明符%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?