关于结构体大小问题的解析

对于初步学习C语言结构体的人来说,往往会对结构体的大小产生错误的理解。
struct A
{
char a;
int b;
};
以这个结构体来举例说明,初学者认为结构体A中字符型a占用1个字节, 整型 b占用4个字节。所以此结构体的大小应为5。但事实情况是否如此呢?首先我在Visual studio2012中编写代码,并通过用sizeof函数求出大小如图所示:
在这里插入图片描述
编译并运行,结果如下图:
在这里插入图片描述

运行结果显示结构体A的大小为8。这就是结构体中的一个重点问题——内存对齐。
出现内存对齐是因为1.(编译器原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2.(性能原因):数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。本质原因:必须让所有的成员放在能被其大小整除的地址上,
对于以上结构体,在内存中摆放如下(考虑内存对齐):
在这里插入图片描述
所以A结构体的大小为8个字节。
通过了解了内存对齐,那么我们应该如何计算结构体的大小呢?
1.结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果不成整数倍数,那么在成员之间加上填充相应字节。
2.结构体的总大小是单个最大成员大小的倍数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值