结构体所占空间大小问题

159 阅读2分钟

结构体所占空间大小问题

1 前言

结构体在C语言中频繁应用于处理生活问题的一种类型。结构体是一些不同类型的值的集合。

2 一般结构体

2.1 结构体声明

结构体是由相同类型(或不同类型)的成员组成,通常结构体的声明具体如下所示:

struct tag
{
    member-list;
}variable-list;

member-list是结构体成员,variable-list是结构体变量名;此外,结构体的成员在内存中是依照声明的先后顺序存储的。

2.2 结构体成员的存储

为了说明结构体成员的存储方式,这里我们使用学生信息作为结构体进行说明。学生信息通常由姓名、年龄、性别和身高等信息组成,结构体的声明及初始化如下图所示:

image-20220927231621362

根据上图代码,在我们想象中s在内存中的样子如下图所示:

image-20220927232721660

实际上,s在内存中占用的存储空间为36,而我们想象中应该是20+4+5+4=33。

image-20220927233714848

之所以会出现这种情况是因为偏移量的存在。

2.3 结构体成员访问

结构体的成员调用规则具体如下:

结构体变量.结构体成员名

结构体指针->结构体成员名

3. 对齐结构体

讲到上述结构体中存在偏移就不得不提地址对齐。由于在实际存储中,计算机要求存储的变量其地址要对齐。且必须满足以下要求:

1.结构体变量中成员的偏移量必须是成员大小的整数倍(0是任何数的整数倍)
2.结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。

按照上述地址对齐的规则,下图所示的学生信息结构体变量s的存储,与运行结果相等。

image-20220927235307386

上述地址对齐的偏移是在默认情况下进行的,亦可通过**#pragma pack(size)**来自定义地址对齐偏移量,将学生信息的对齐偏移量设置为2Byte,则学生信息结构体的存储空间为24Byte.

image-20220927235638078

如果您有什么问题,请在下面留言哦~汪汪会及时回复