结构体大小

题目:student 结构体的大小是多少?

struct date{
	int year;
	int month;
	int day;
};

struct student{
	int number;
	char sex;
	int age;
	char name[10];
	struct date birthday;
};

结构体成员偏移规则

  1. 每个成员的偏移量都必须是当前成员所占内存大小的整数倍,否则编译器会在前一个成员后面填充字节,使得当前成员的偏移量是其内存大小的整数倍
  2. 数组的字节对齐值等于它的一个元素的字节对齐值
  3. 结构体的字节对齐值等于它的所有成员的字节对齐值中的最大值
  4. 当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍,如果不是会在最后一个成员后做字节填充

注意:由 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

答案

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值