C语言计算出结构体所占空间大小

第一次写博客,而且是一个小萌新,有什么错误的地方请各位大佬及时提出来,我会立即更改,最后希望这篇文章能对你有帮助

大家对用struct关键字创建一个结构体应该不陌生,但是我们创建的结构体的空间大小怎么计算呢?

这里三个要点:

1.结构体成员代码由上往下执行。

2.结构体成员的地址偏移量(偏移量指的是相对于结构体起始位置的偏移量)应该是该成员所占空间的整数倍(否者就接着往后填充,直到是整数倍)

3.最终结构体的空间大小是该结构体内所有成员的大小的整数倍(填充最小以满足要求)

我们用两段代码来做比较

代码1:

#include<stdio.h>
struct S
{	
	char a;
	double b;
	int c;
	short d;
};
int main()
{
	struct S s;
	printf("%d\n",sizeof(s));
	return 0;
}

代码2:

#include<stdio.h>
struct S
{	
	int c;
	char a;
	short d;
	double b;
};
int main()
{
	struct S s;
	printf("%d\n",sizeof(s));
	return 0;
}

两段代码仅仅是结构体成员位置不同,最终运行的结果也有可能不相同。

代码1的运行结果

 

代码2的运行结果

我们来详细了解一下要点2

我们还是看代码1的结构体各成员地址

成员a的地址是 0x0113FA0C 偏移量是0(偏移量指的是相对于结构体起始位置的偏移量),成员b为double型,占8个字节,向后填充,满足偏移量是8, 然后 0x0x0113FA14 偏移量是8的倍数,所以成员b的地址为0x0x0113FA14。后面的以此类推。

直到结构体最后一个成员的地址,所以 1 + 7 + 8 + 4 + 2 = 22(蓝色的为填充部分)可是运行结果明明是24啊,不着急,我们来看要点3

要点3详解:

我们的结构体最终大小是该结构体内的所有成员的大小的整数倍,我们再看上图,算出占22个字节空间,可是22不是8的倍数,向后填充,满足最小填充为24,所以结果为24。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值