联合结构在将其分配给字节数组后获得意外数据
Structure in union getting unexpected data after assigning it to a byte array
我有一个包含一些数据的 255 字节数组
- 标志:1 字节(无符号字符)
- 地址:4字节(unsigned int)
- 文本: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
- 文本 = { 0x04, 0x05, 0x00, 0x00, ... }
我原以为标志为 0,地址为 0,文本为 {0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00, ...}。访问时好像对齐不对
这是什么解释?
问题在于,对于大多数处理器,必须在分别为 4 字节和 8 字节的倍数的地址处访问 4 字节和 8 字节数据项。这意味着如果 int 是 4 字节,则它需要位于 4 字节边界上。 char 是单个字节,因此需要 3 个填充字节来对齐 int。如果你有双精度数或者在 64 位机器上,你可能会发现双精度数和整数在 8 字节边界上对齐。
我有一个包含一些数据的 255 字节数组
- 标志:1 字节(无符号字符)
- 地址:4字节(unsigned int)
- 文本: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
- 文本 = { 0x04, 0x05, 0x00, 0x00, ... }
我原以为标志为 0,地址为 0,文本为 {0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00, ...}。访问时好像对齐不对
这是什么解释?
问题在于,对于大多数处理器,必须在分别为 4 字节和 8 字节的倍数的地址处访问 4 字节和 8 字节数据项。这意味着如果 int 是 4 字节,则它需要位于 4 字节边界上。 char 是单个字节,因此需要 3 个填充字节来对齐 int。如果你有双精度数或者在 64 位机器上,你可能会发现双精度数和整数在 8 字节边界上对齐。