本文共 1140 字,大约阅读时间需要 3 分钟。
1.结构体struct大小计算
2.联合体union大小计算
3.枚举体enum的大小计算
1.结构体struct大小计算
奉行两个规则:
1.结构体中每个成员的偏移量必须是该成员自己所占内存大小 的整数倍,否则,会用空白字节填充。
2.当运用规则1 计算结构体大小完毕后,其结构体大小必须是 该结构体中最大的成员变量 的整数倍,否则会用空白字节填充。
偏移量:结构体某个成员变量的位置 与 结构体首地址的距离
例子:
#include运用规则1: 1.遇到变量a,其偏移量为0,变量大小为1 2.遇到变量b,其偏移量为0+1=1,变量大小为1 3.遇到变量c,其偏移量为1+1=2,变量大小为4,因为 2 不是 4 的整数倍,所以偏移量填充至4. 4.遇到变量d,其偏移量为4+4=8,变量大小为8。 5.遇到变量e,其偏移量为8+8=16,变量大小为1. 运用规则2: 运用规则1计算的结构体大小为17,又结构体最大的成员变量为8。而17 不是 8的整数倍,所以最终结构体大小为24struct unknown { char a; char b; int c; long d; int e;}; int main () { printf("%lu\n", sizeof(struct unknown)); return 0;}
2.联合体union大小的计算
奉行的两个规则:
1.联合体大小必须能容纳联合体中最大的成员变量
2.通过规则1 计算出的联合体大小必须是 联合体中占内存大小最大的成员类型 的整数倍
例子:
typedef union u1{ char a[6]; int b;}U1;typedef union u2{ int a; long b;}U2;typedef union u3{ char a[6]; char b[5];}U3;三个联合体 u1,u2,u3的大小分别是 8,8,6
u1:
根据规则1,最大的成员变量是 a[6],其大小为 6.
根据规则2,最大的成员类型是 int ,其大小为 4。 6不是 4 的整数倍,因此6填充至8,所以其最终大小为 8
u2:
根据规则1,最大的成员变量为 b,其大小为8.
根据规则2,最大的成员类型是 long,其大小为8, 因为 8 是 8 的整数倍,所以 其最终大小为8
u3:
根据规则1,最大的成员变量为 a[6],其大小为6
根据规则2,最大的变量类型为 char,其大小为1,6是1的整数被,所以其最终大小为6
3.枚举体enum 的大小计算
枚举体enum的大小同 int 的大小一样。都为4
转载地址:http://ezbh.baihongyu.com/