结构体和联合体字节对齐问题

22 篇文章 0 订阅

结构体和联合体字节对齐问题实例

在之前刷题的过程中遇到了一道题目:

它是长这样的:


typedef union {long i; int k[5]; char c;} DATE;

       struct data { int cat; DATE cow; double dog;char cmd} too;

       DATE max;

       语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果

在4字节对齐情况下是:_______

在2字节对齐情况下是:_______

在1字节对齐情况下是:_______


①我们先看在系统默认字节对齐的情况下,输出结果是多少:

 

我们可以看到,联合体的大小为20,因为是在32位操作系统下,当然如果更改为64位系统下,则这个联合体的大小则为24

另外这个结构体的大小则为4 + 20 + 8 +(1+7) = 40了

所以结果为40 + 20 = 60

 

②:再看看在4字节对齐的情况下,输出结果是多少:

 

我们可以看到,联合体的大小为20,因为是在32位操作系统下,当然如果更改为64位系统下,则这个联合体的大小则为24

另外这个结构体的大小则为4 + 20 + 8 +(1+3) = 36了

所以结果为36 + 20 = 56

 

③:再看看在2字节对齐的情况下,输出结果是多少:

 

我们可以看到,联合体的大小为20,因为是在32位操作系统下,当然如果更改为64位系统下,则这个联合体的大小则为24

另外这个结构体的大小则为4 + 20 + 8 +(1+1) = 34了

所以结果为34+ 20 = 54

 

④:再看看在1字节对齐的情况下,输出结果是多少:

 

我们可以看到,联合体的大小为20,因为是在32位操作系统下,当然如果更改为64位系统下,则这个联合体的大小则为24

另外这个结构体的大小则为4 + 20 + 8 +(1) = 33了

所以结果为33 + 20 = 53

 

⑤:当然 若是在64位操作系统下,我们也可以看一看其大小:

 

我们可以看到,联合体的大小为24,因为是在64位系统下,则这个联合体的大小需要以long类型的8字节对齐,所以则为24

另外这个结构体的大小也就为为(4+4) + 24 + 8 + (1+7) = 48

所以结果为48 + 24 = 72

 

当然,若将结构体中的char cmd前移,就会产生变化:

 

我们可以发现这个结构体不再是48了,而是40了

因为int类型的cat和char类型的cmd加在一起才占5个字节,不足8个字节,只用补一次即可,所以其结构体的大小为(4+1+3)+ 24 + 8 = 40

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值