关于结构体中有共用体成员时所占内存容量的计算

今天碰到一个面试题,题目如下:

 #include <stdio.h>

typedef union
{
 double a;
 short b[5];
 char c;
}data;

typedef struct
{
 long a;
 data d;
 char b;

}list;
int main()
{
 data da;
 list li;
 printf("%d,%d",sizeof(da),sizeof(li));
}

当然不是原题,但形式差不多,当时我理解有误,最初我是这样理解的,首先看union,最大的应该是short b[5],它占10个字节,然后转到struct中,Long占4个字节,然后加10,再加1,总共15个字节,但由于内存对齐的缘固,我答的是16,如果这样理解就大错特错了,实际上应该这样:

在union里,double (8),short(2),char(1),在类型中以double最大,但是short是一个数组,加起来它的字节就变为10了,本来如果没有内存对齐的话,输出为10也就对了,但是c语言偏有这个规定,所占内存大小必须是最大类型(注意不是所占的最大字节数,一定要理解什么是类型,数组不是类型,只有int ,double,char 等才是)的整数倍,我们的最大类型是double(8),而10不是8的整数倍,所以应该输出为16,然后再看struct,long(4),data(16),char(1),如果按我的思路,应该是4+16+1,再考虑对齐的话是24(我以long类型最大),又错了,错误有两点,在这里不是long最大,还是double最大,二是c语言的另一规定,就是每个变量存储时它的起始地址也必须是它类型的整数倍,也就是Long以后,它的地址为4,但是union里的double为8,它必须存到以8的位数开头的地址上,这时候离它最近的就是地址8了,所以long存储以后再后面又加了几个空格一直到地址8为止,这时8+16+1=25最大类型还是为8,根据对齐,它应该输出为32

所以答案就是16,32

我们为了验证,还可以把union 中的double 类型注释掉,这时结果为10,16;然后去掉注释,把struct 中的char 注释掉,这时结果为16,24,你能明白我这样做的目的吗,如果明白,那你就很精通这个了。

      这是我第一次写东西,比较粗糙,大家看不懂的地方多动手查查资料,只有自己多动手,才能变知识为技术,希望给大家一些收获,谢谢。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值