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



我有一个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字节的边界上对齐。

最新更新