结构体和联合体字节对齐问题实例
在之前刷题的过程中遇到了一道题目:
它是长这样的:
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