C语言结构体大小、联合体大小计算

结构体中的偏移量

结构体中的偏移量是一个成员的实际地址和结构体首地址之间的距离。

结构体的大小计算

偏移规则:
(1)每个成员的偏移量都必须是当前成员所占内存大小的整数倍如果不是编译器会在成员之间加上填充字节。

(2)当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍 如果不是会在最后一个成员后做字节填充。

例:

struct c
 {
	  char a;
	  int b;
	  short c;
	  double d;
 }

结构体含一个char类型,一个int类型,一个short类型,一个double类型的变量,本来应该占1+4+2+8=15个字节,但实际不是这样的。

分析:
(1)遇到第一个成员变量a,该成员偏移量为0,所占内存大小为1,符合偏移规则第一条。
(2)遇到第二个成员变量b,偏移量为1,所占内存大小为4,不符合偏移规则第一条,在成员变量之间添加3个字节,此时偏移量为4,符合偏移规则第一条。
(3)遇到第三个成员变量c,偏移量为8,所占内存大小为4,符合偏移规则第一条。
(4)遇到第四个成员变量d,偏移量为12,所占内存大小为8,不符合偏移规则第一条,在成员变量c和d之间添加4个字节,此时偏移量为16,符合偏移规则第一条。
(5)所有成员大小计算完后,执行偏移规则第二条,最宽的类型是d,long类型,8个字节,当前结构体计算出的大小为24,符合第二条规则,到此结构体大小计算结束。

联合体大小计算规则

联合体的内存除了取最大成员内存外,还要保证是所有成员类型size的最小公倍数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值