C语言 联合大小更改,出现意外的单词对齐[重复]

lokaqttq  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(105)

此问题已在此处有答案

sizeof union larger than expected. How does type alignment take place here?(3个答案)
7天前关闭
我有一个结构体和一个联合体,定义如下

struct aa{
   float j;
   char aaa;
   char bbb;
   int bb;
}aaaa; sizeof(aaaa) 12bytes

union utag{
   char bb;
   float kk;
   char *c;
   struct aa lala;
}haha; sizeof(haha) 16bytes

我的编译器告诉我sizeof(aaaa)是12,sizeof(haha)是16。
我知道sizeof(aaaa)是12,因为我有一个2字节的填充,用于int bb的4字节字对齐。
但是,我不明白为什么我的工会哈哈是16字节。我希望它是12字节,因为结构aa类型是里面最大的元素。
奇怪的是,如果我在union中注解掉char *c元素,sizeof(haha)会像预期的那样变成12字节。

union utag{
   char bb;
   float kk;
   //char *c;
   struct aa lala;
}haha; sizeof(haha) 12bytes

我已经搜索了重复的问题,但没有其他问题表明,一个已经字对齐的结构(12bytes)添加了填充字节(在这种情况下,使其成为16)的情况,或者删除一个不影响联合大小的联合元素的情况(删除char *,这是8bytes,不应该改变联合大小,它已经是16bytes的结构元素)实际上影响了大小。

ymdaylpp

ymdaylpp1#

似乎在所使用的系统中sizeof( char * )等于8
因此,数据成员c的地址应该可以被8整除以进行对齐。
但是数据成员lala不能提供这样的对齐,则例如单元类型的对象被放置在阵列中。因此,该单元附加了4个字节,以保证fata成员c的对齐。

相关问题