C语言 结构体存储空间分配

这篇博客探讨了C语言结构体存储空间分配的原理,包括编译器如何按照成员列表顺序分配内存并满足边界对齐要求。博主通过举例说明了结构体变量的首地址、成员偏移量和总大小的计算规则,并解释了不同元素顺序对结构体大小的影响,揭示了内存对齐的重要性。
摘要由CSDN通过智能技术生成

这两天在看结构体,一直在琢磨结构体的存储空间分配的问题,琢磨了半天总算明白了。和大家分享一下,希望能有所帮助。
相信大家都知道结构体里元素存储要对齐吧,话虽是没错,只是这个“对齐”里面包含了很多微妙的东西。首先详细的给出结构体内存存储空间分配的原则吧:编译器按照成员列表顺序一个接一个地给每个成员分配内存。只有当存储成员时需要满足正确的边界对齐要求时,成员之间才可能出现用于填充的额外内存空间。
而且还有3点要求:
结构体变量的首地址要能够被其最宽基本类型元素的大小所整除。
结构体的每个元素相对于结构体首地址的偏移量都是元素大小的整数倍,如有需要编译器会在元素之间加上填充字节。
结构体的总大小为结构体最宽基本类型元素大小的整数倍,如有需要编译器会在最末一个元素之后加上填充字节。
下面来看几个例子(32位为例):
sizeof操作符能够得出一个结构的整体长度,包括因边界对齐而跳过的那些字节。所以一般都用sizeof来计算其所占存储空间。
struct t1
{
int a;
char b;
char c;
};
首先创建的是int类型的a为4字节,但是其后一个b只占1个字节,所以不要和char b对齐。因为其后一个c只占1个字节,所以也不用对齐。所以结构体t1一共占:4+1+1=6个字节,但是根据要求3,结构体的总大小为结构体最宽基本类型元素大小的整数倍。而在这个例子中,最宽的元素为int a,为4字节。所以最后结构体t1的总大小必须为4的倍数,因此最终的字节数为8。所以,这里编译器自动充填了2字节的充填字节。
下面让我们将例1中元素的顺序调一下位置看看:
struct

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值