知识点:
1.第一个成员在结构体变量偏移量为0的地址处
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值
3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数得到整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
解释:
1.char c是第一个成员,所有就从偏移量为0处开始存储
2.char c存储完,来到偏移量为1,int i是4个字节,所有要从4的倍数开始存储,就从1开始找到4的倍数,然后到达了偏移量4,4为4的倍数,所有int就从偏移量4开始存储
3.int i存储完,来到偏移量为8,double d是8个字节,所有要从8的倍数开始存储,然后发现现在在偏移量为8的位置上,正好是8的倍数,所有就从偏移量为8开始存储,存储8个字节
4.double d存储完,来到偏移量为16,然后利用知识点3,判断总大小是否为最大对齐数的整数倍,数格子,数了得16,正好是8的倍数,所有此结构体的大小就为16
计算偏移量的值:offsetof-----<stddef.h>
修改对齐数:pragma pack()