C语言中结构体内存分配(内含数组与结构体版)----超级详细版

在网上看资料了很久,看的我头晕都没看懂,不如自己操作一遍,总结出来了经验。

首先我们要理解这几个概念:

1) 结构体变量的首地址是其最长基本类型成员的整数倍;

2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

3) 结构体的总大小为结构体最宽基本类型成员大小的 整数 倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。

4) 结构体内类型相同的连续元素将在连续的空间内,和数组一样。

5) 如果结构体内存在长度大于处理器位数的元素,那么就以处理器的倍数为对齐单位;否则,如果结构体内的元素的长度都小于处理器的倍数的时候,便以结构体里面最长的数据元素为对齐单位。

上例子

(1)
1
这个结构体中,最长基本单位为double,即为8字节;
第一个变量a没有偏移,内存大小为3字节;
第二个变量b本身为20字节,与前面的变量加起来23字节,并不是8字节的倍数,故空出1字节,总共为24字节;
第三个变量c本身字节为1,刚好填入前面空出的字节中,故总共为24字节;
第四个变量d本身字节为8,为8字节的整数倍,故分配8字节,此时加起来32字节;
第五非变量e本身字节为1,并不是8字节的整数倍,故分配最小倍数8字节补齐,此时加起来内存大小40字节;

(2)
2
这个结构体中,最长基本单位为double,即为8字节;
第一个变量a没有偏移,内存大小为3字节;
第二个变量b本身为20字节,与前面的变量加起来23字节,并不是8字节的倍数,故空出1字节,总共为24字节;
第三个变量c本身字节为4,并不能填入之前的空出字节,故分配最小倍数8字节补齐,故总共为32字节;
第四个变量d本身字节为8,为8字节的整数倍,故分配8字节,此时加起来40字节;
第五非变量e本身字节为1,并不是8字节的整数倍,故分配最小倍数8字节补齐,此时加起来内存大小48字节;

(3)
3
这个结构体中,最长基本单位为int,即为4字节;
第一个变量a没有偏移,内存大小为3字节;
第二个变量b本身为20字节,与前面的变量加起来23字节,并不是4字节的倍数,故空出1字节,总共为24字节;
第三个变量c本身字节为1,可以填入之前的空出字节,故总共为24字节;
第四个变量d本身字节为4,为4字节的整数倍,故分配4字节,此时加起来28字节;
第五个变量e本身字节为1,并不是4字节的整数倍,故分配最小倍数4字节补齐,此时加起来内存大小32字节;

其实内含其他结构体原理相同
(4)
4
这个结构体中,最长基本单位为int,即为4字节;
第一个变量a没有偏移,内存大小为3字节;
第二个变量b本身为20字节,与前面的变量加起来23字节,并不是4字节的倍数,故空出1字节,总共为24字节;
第三个变量c本身字节为1,可以填入之前的空出字节,故总共为24字节;

此时下一个数据类型是结构体,我们先算出它自身结构体的内存大小:
这个结构体中,最长基本单位为double,即为8字节;
第一个变量a没有偏移,内存大小为3字节;
第二个变量d本身为8字节,为8的整数倍,所以为8字节,与前面加起来为11字节,此时不为8的倍数,故空出5字节,总共为16字节;
第三个变量e本身1字节,并不是8的整数倍,故分配最小倍数8字节补齐,此时加起来内存大小24字节;
所以内含结构体为24字节,且为外面最长基本字节4的整数倍,所以直接加上上面内存大小,总共为48字节

第五个变量d本身字节为4,为4字节的整数倍,故分配4字节,此时加起来52字节;
第六个变量e本身字节为1,并不是4字节的整数倍,故分配最小倍数4字节补齐,此时加起来内存大小56字节;

转载请标明原链接

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Abyssal丶Sun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值