此问题已在此处有答案:
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的结构元素)实际上影响了大小。
1条答案
按热度按时间ymdaylpp1#
似乎在所使用的系统中
sizeof( char * )
等于8
,因此,数据成员
c
的地址应该可以被8
整除以进行对齐。但是数据成员
lala
不能提供这样的对齐,则例如单元类型的对象被放置在阵列中。因此,该单元附加了4个字节,以保证fata成员c
的对齐。