我有一个包含一些数据的255字节数组
我的工会看起来像这样:
union {
unsigned char buf[255];
struct{
unsigned char flag;
unsigned int address;
char text[13];
} structure;
} the_union
我使用以下代码将数据缓冲区视为我的联合,通过联合我可以使用struct访问它。 (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, .... ]
我从我的结构中得到的值如下:
我期望标志为0,地址为0,文本为{0x01,0x02,0x03,0x04,0x05,0x00,0x00,...}。在访问期间似乎对齐是错误的。
对此有何解释?
答案 0 :(得分:2)
问题在于,对于大多数处理器,必须在分别为4字节和8字节的倍数的地址处访问4字节和8字节数据项。这意味着如果int是4个字节,则需要在4字节边界上。 char是单个字节,因此需要3个填充字节来对齐int。如果你有双打或在64位机器上,你可能会发现双精度和整数在8字节边界上对齐。