1.结构体struct大小计算
2.联合体union大小计算
3.枚举体enum的大小计算
1.结构体struct大小计算
奉行两个规则:
1.结构体中每个成员的偏移量必须是该成员自己所占内存大小 的整数倍,否则,会用空白字节填充。
2.当运用规则1 计算结构体大小完毕后,其结构体大小必须是 该结构体中最大的成员变量 的整数倍,否则会用空白字节填充。
偏移量:结构体某个成员变量的位置 与 结构体首地址的距离
例子:
#include <stdio.h>
struct unknown {
char a;
char b;
int c;
long d;
int e;
};
int main () {
printf("%lu\n", sizeof(struct unknown));
return 0;
}
运用规则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的整数倍,所以最终结构体大小为24
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