我有一个255字节的数组,其中包含一些数据
- 标志:1字节(无符号字符)
- 地址:4字节(无符号整数)
- text:13字节(char[13])
我的工会是这样的:
union {
unsigned char buf[255];
struct{
unsigned char flag;
unsigned int address;
char text[13];
} structure;
} the_union
我使用以下代码将数据缓冲区视为我的并集,通过并集我可以使用结构访问它。(buf作为函数参数传入)
the_union * ptr = (the_union*) buf;
char flag = ptr->structure.flag;
unsigned int address = ptr->structure.address;
char * text = (char*) ptr->structure.text;
在调试过程中,我注意到,虽然我在缓冲区中得到的值与我期望的结构匹配,但当我试图在联合中访问它们时,这是不正确的。
在我的缓冲区中,我有以下字节:
[0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00, .... ]
我从我的结构中得到的值如下:
- 标志=0x00
- 地址=0x00010203
- text={0x04、0x05、0x00、0x00…}
我希望标志为0,地址为0,文本为{0x01、0x02、0x03、0x04、0x05、0x00、0x00…}。访问过程中似乎对齐错误。
对此有何解释?
问题是,对于大多数处理器,访问4字节和8字节数据项的地址必须分别是4字节和八字节的倍数。这意味着,如果int是4个字节,那么它将需要位于4个字节的边界上。char是一个单字节,因此需要3个填充字节来对齐int。如果你有doubles或在64位机器上,你可能会发现doubles和int在8字节的边界上对齐。