【c语言】详解 结构体的内存对齐补齐

文章详细阐述了C语言中结构体内存对齐的现象,通过改变变量顺序导致内存空间变化的例子,解释了内存对齐的原理,即操作系统根据最大数据类型分配内存空间,并按顺序放置变量。作者建议合理规划结构体内的变量顺序以减少内存浪费,并提供了文末检验题以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c语言系列专栏:c语言之路重点知识整合 🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

更多结构体知识点:结构体详解


一、现象

在这里插入图片描述

先定义一个结构体:

struct AA 
{
	int a; 
	short c; 
	char b; 
}  ;

对该结构体的空间大小进行计算:

int main()
{
	//测试不同结构体的空间大小
	printf("%d\n",sizeof(struct AA));
	return 0;
}

结果为8

在这里插入图片描述


如果将AA结构体中的变量顺序进行改变:

struct AA2
{
	short c;
	int a;
	char b;	
};

再次输出该结构体的内存空间大小:

在这里插入图片描述

我们只是将结构体中的变量顺序进行了改变,内存空间居然发生了改变,结果却变成了12

在这里插入图片描述

按照之前对结构体的理解,我们并没有规定结构体内部变量的定义顺序

从本例可以看出,结构体内部变量的定义顺序也很重要

这种现象就是结构体的内存对齐补齐

二、原理

我本人是这么理解的:

操作系统对内存分配的动态内存分配算法:
结构体这里申请内存空间 使用的是 首次适应算法:从可用的内存空间中找到第一个能够容纳所需内存大小的空间,分配给请求内存的进程

根据结构体中所占字节数最大的 比如int 申请一些4字节的空间段,然后按顺序依次将结构体中其他的数据类型存入到这些相同空间(4字节)的内存段中。

在这里插入图片描述

用例解释:

用上面的AA和AA2结构体例子解释:

AA结构体中:

先根据结构体中的最大类型int确定 结构体中每一段空间为4字节(int的大小)

然后按照从上到下的顺序,将结构体中的变量放入内存段中

如果内存段大于等于变量的类型大小(AA中第一段内存空间4字节刚好放下4字节的a变量)

然后第二段内存空间为4字节,short类型的c变量占用2字节,可以放下,就将c放入,此时第二段内存空间还剩2字节

最后char类型的b变量占用1个字节,现在第二段的可用空间为2字节,可以放下,就将b放入,浪费1字节的空间

最终结果为2×4=8个字节

AA2结构体中:

还是先根据结构体中的最大类型int确定 结构体中每一段空间为4字节(int的大小)

然后按照从上到下的顺序,将结构体中的变量放入内存段中

如果内存段大于等于变量的类型大小,AA2中第一段内存空间4字节大于short类型c变量2字节,就将c放入第一段,此时第一段内存空间剩余2字节。

然后按照顺序该轮到int类型a变量4字节放入内存空间,但此时第一段内存空间只有2字节,就会放入(申请)第二段内存空间

(第二段内存空间和第一段内存空间大小一样,都是根据结构体中的最大类型int确定)(int的大小)

第二段内存空间为4字节,刚好放下a变量

接着时char类型的b变量,占用一个内存,但此时没有可用的内存空间,会再次申请4字节,b变量1个字节小于4字节,放入后浪费3字节的空间。

最终结果为3×4=12个字节

在这里插入图片描述

数组占用的空间:

将数组中的各成员拆成单个,再根据上文的规则放入

在这里插入图片描述

文末检验:

这个XX结构体自己模拟一下叭:

在这里插入图片描述

答案为32个字节,模拟一遍各变量放入内存的过程吧

在这里插入图片描述

因此,对于结构体中变量的定义顺序要有合理的规划,才能做到尽可能地不浪费过多空间。


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值