结构体所占空间大小问题
1 前言
结构体在C语言中频繁应用于处理生活问题的一种类型。结构体是一些不同类型的值的集合。
2 一般结构体
2.1 结构体声明
结构体是由相同类型(或不同类型)的成员组成,通常结构体的声明具体如下所示:
struct tag
{
member-list;
}variable-list;
member-list是结构体成员,variable-list是结构体变量名;此外,结构体的成员在内存中是依照声明的先后顺序存储的。
2.2 结构体成员的存储
为了说明结构体成员的存储方式,这里我们使用学生信息作为结构体进行说明。学生信息通常由姓名、年龄、性别和身高等信息组成,结构体的声明及初始化如下图所示:
根据上图代码,在我们想象中s在内存中的样子如下图所示:
实际上,s在内存中占用的存储空间为36,而我们想象中应该是20+4+5+4=33。
之所以会出现这种情况是因为偏移量的存在。
2.3 结构体成员访问
结构体的成员调用规则具体如下:
结构体变量.结构体成员名
结构体指针->结构体成员名
3. 对齐结构体
讲到上述结构体中存在偏移就不得不提地址对齐。由于在实际存储中,计算机要求存储的变量其地址要对齐。且必须满足以下要求:
1.结构体变量中成员的偏移量必须是成员大小的整数倍(0是任何数的整数倍)
2.结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。
按照上述地址对齐的规则,下图所示的学生信息结构体变量s的存储,与运行结果相等。
上述地址对齐的偏移是在默认情况下进行的,亦可通过**#pragma pack(size)**来自定义地址对齐偏移量,将学生信息的对齐偏移量设置为2Byte,则学生信息结构体的存储空间为24Byte.
如果您有什么问题,请在下面留言哦~汪汪会及时回复