题目:student 结构体的大小是多少?
struct date{
int year;
int month;
int day;
};
struct student{
int number;
char sex;
int age;
char name[10];
struct date birthday;
};
结构体成员偏移规则
- 每个成员的偏移量都必须是当前成员所占内存大小的整数倍,否则编译器会在前一个成员后面填充字节,使得当前成员的偏移量是其内存大小的整数倍
- 数组的字节对齐值等于它的一个元素的字节对齐值
- 结构体的字节对齐值等于它的所有成员的字节对齐值中的最大值
- 当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍,如果不是会在最后一个成员后做字节填充
注意:由 2 可得,char name[10] 的字节对齐值为 sizeof char,即为 1
解答
struct date{
int year;// 偏移量 0,内存大小 4
int month;// 偏移量 4,内存大小 4
int day;// 偏移量 8, 内存大小 4
// 符合结构体成员偏移规则中的第一条
// 总大小 4 + 4 + 4 = 12
};
所以,结构体 date 的大小为 12
struct student{
int number;// 偏移量 0, 内存大小 4
char sex;// 偏移量 4, 内存大小 1
int age;// 偏移量 5,内存大小 4
// age 不符合结构体成员偏移规则中的第一条,前一个成员 sex 需要补充 3 位
// 此时 age 偏移量 4 + 1 + 3 = 8,内存大小 4
char name[10];// 内存大小 1 * 10
struct date birthday;// 内存大小 12
// 总大小 = 各成员大小 + 总偏移量 = 4 + (1 + 3) + 4 + 10 + 12 = 4 + 4 + 4 + 10 + 12 = 34
// 注意:最宽的数据类型为 int,大小为 4,34 不是 4 的整数倍,所以 34 还需要在 birthday 的后面补 2 位,即 34 + 2 = 36
};
所以,结构体 student 的大小为 36