栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

这里三个要点:

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

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

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

我们用两段代码来做比较

代码1:

#include
struct S
{	
	char a;
	double b;
	int c;
	short d;
};
int main()
{
	struct S s;
	printf("%dn",sizeof(s));
	return 0;
}

代码2:

#include
struct S
{	
	int c;
	char a;
	short d;
	double b;
};
int main()
{
	struct S s;
	printf("%dn",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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033127.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号