联合结构在将其分配给字节数组后获得意外数据

Structure in union getting unexpected data after assigning it to a byte array

我有一个包含一些数据的 255 字节数组

我的联盟是这样的:

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, .... ]

我从我的结构中得到的值如下:

我原以为标志为 0,地址为 0,文本为 {0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00, ...}。访问时好像对齐不对

这是什么解释?

问题在于,对于大多数处理器,必须在分别为 4 字节和 8 字节的倍数的地址处访问 4 字节和 8 字节数据项。这意味着如果 int 是 4 字节,则它需要位于 4 字节边界上。 char 是单个字节,因此需要 3 个填充字节来对齐 int。如果你有双精度数或者在 64 位机器上,你可能会发现双精度数和整数在 8 字节边界上对齐。