结构体中的数据是如何存储的(结构体中的内存对齐)

我们都知道c语言中有自定义类型,而自定义类型中,我们经常需要使用结构体类型,今天我们就来探究结构体中的数据是如何存储的。

试想一下,S1、S2、S3的数据各占几个字节??

大概的答案都是:5  6  7

因为这种思考方式都是将里面的数据按大小依次排列,int类型占4个字节,char类型占1个字节,故S1占4 + 1 = 5个字节,S2、S3以此类推,但是事实是这样的吗??

正确的结果如下:

至于为什么会这样,下面我们将对结构体的存储方式进行解析。

 这是S1的起始位置:

右边的数字(0,1...)代表着偏移量,每一个数据都有偏移量

第一个规则:

粉红色的位置是int a所占据的空间

第二个规则:

所以 char c的存放位置就是4,因为1格就是最小的默认对齐数,即char类型的大小:1

第三个规则: 

实际存放的结果如下:

结构体的总大小是8,最大对齐数是4,8是4的倍数,所以结构体大小就为8,红色部分就是浪费的空间,这样一个结构体变量就存储成功了

下面我再举几个例子来说明存储方式:

红色部分仍是浪费的空间,注意这里的int a是从4的位置开始存储的

通过宏offsetof可以计算偏移量,结果就是0和4

下面是另一个例子:

操作步骤和三步方式一致。

知道了三条规则后下面我们引出第四条规则:

进阶例子:

本质上就是将结构体中的变量展开。

那么为什么结构体中的数据会进行内存的对齐呢??

知道了有些时候我们不得不牺牲一些空间去存放结构体,但是我们要做一个有头脑的程序员,我们要在编写程序的时候去节约一点空间。

同样的类型,只是调整一下成员变量的顺序就节约了4个字节,所以在编写结构体时,我们应该遵循:

同时如果我们觉得默认对齐数不合理,我们也可以修改默认对齐数

以上就是本期的所有内容,谢谢观看!!

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sugar_goat

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

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

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

打赏作者

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

抵扣说明:

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

余额充值