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

时间:2015-04-30 05:52:24

标签: c arrays struct alignment unions

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

  • flag:1个字节(unsigned char)
  • 地址:4个字节(unsigned int)
  • text:13 bytes(char [13])

我的工会看起来像这样:

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

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

  • flag = 0x00
  • 地址= 0x00010203
  • text = {0x04,0x05,0x00,0x00,...}

我期望标志为0,地址为0,文本为{0x01,0x02,0x03,0x04,0x05,0x00,0x00,...}。在访问期间似乎对齐是错误的。

对此有何解释?

1 个答案:

答案 0 :(得分:2)

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