C语言结构体,联合体,枚举体的大小计算

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

猜你喜欢

转载自blog.csdn.net/u014453898/article/details/79474518