【C语言】——结构体进阶:结构体的内存对齐(超详细)

前言:

        上一篇已经讲了结构体的基本用法。相信各位小伙伴以经学会怎么使用。但是还有一个问题没有弄明白——结构体到底多大,占内存空间多不多,以经系统到底怎么访问结构体内的数据的。

        接下来,详细分析一下结构体的内在……

目录

1.修炼内功,掌握结构体的内存对齐

1.1结构体对齐规则四步走:

2.为什么要会存在内存对齐

2.1怎么修改默认对齐数

3.结构体传参

4.叠甲


1.修炼内功,掌握结构体的内存对齐

        上篇已经讲述了结构体的基本使用,现在来深入探究下一个问题:计算结构体的大小。这个问题也会经常出现在各个大厂的笔试题目中,即——结构体对齐。

        话不多说。直接在下面的代码中感受下:

int main()
{
	//练习1
	struct S1
	{
		char c1;
		int i;
		char c2;
	};
	printf("%d\n", sizeof(struct S1));
	//练习2
	struct S2
	{
		char c1;
		char c2;
		int i;
	};
	printf("%d\n", sizeof(struct S2));
    return 0;
}

        (留给空间给盆友么思考!!!先思考,再看下面的)        

        盆友们,对于练习1和练习2的的答案是多少呢?

        相信刚接触的铁子们肯定觉得s1和s2的长度都是6吧(32位系统中)。这很简单呀,s1和s2里面都是char char int  三个变量类型,为 1 1 4。所以加起来是6咯。这有啥难的。

        其实,非也。咱们调试起来瞧瞧看。

        是 12 和 8……

        为啥会这样呢?

        12 和 8 这个答案是不是说明了s1和s2里面的数据居然不是挨着存的(如果是挨着的,就是6),显然之间存了空白的东西。

        既然结构体里面存了空白的位置,那么不妨试试看,结构体内两个变量之前到底相隔多少空白位。

        这里用到offsetof函数

        这个函数是用来计算结构体成员相对于结构体起始位置的偏移量。(不理解没关系,下面会有图解。)

        函数的用法可以参考:

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

待己以诚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值