7.1.5 结构体的大小
基本数据类型具有相对固定的大小,而结构体是复合数据类型,它的成员的类型、数量是不固定的,那么一个结构体的大小是多少呢?可以通过 sizeof 运算符来获取结构体的大小,即结构体类型或该类型的结构体变量的大小。例如:
printf("Size of the struct Person: %u bytes.\n", sizeof(struct Person)); printf("Size of the p1: %u bytes.\n", sizeof p1);
通过 sizeof 运算符来获取 Person 结构体类型和 Person 结构体类型的变量 p1 的大小。Person 结构体共有 4 个成员,第一个成员是长度为 20 的字符数组,大小为 20 字节;第二个成员为 int 类型,大小为 4 字节;第三和第四个成员都为 float 类型,大小都是 4 字节。将 4 个成员的大小合计在一起,共为 32 字节,这就是 Person 结构体的大小。
编译运行程序,结果如下:
Size of the struct Person: 32 bytes. Size of the p1: 32 bytes.
可见,结构体 Person 的大小为 32 字节,与其所有成员大小的总和相等。但这只是巧合,结构体的大小与其成员大小的总和不一定总是对等的关系,即结构体的大小也许会大于其成员大小的总和。例如:
定义了结构体类型 A,它有 3 个成员,第一个成员 a 和第三个成员 c 都是 char 类型的,而第二个成员 b 是 int 类型的,三个成员的大小总和为 6 字节。但是结构体 A 的大小是多少呢?
printf("Size of the struct A: %u bytes.\n", sizeof(struct A));
编译运行程序,结果如下:
Size of the struct A: 12 bytes.
从结果可见,结构体 A 的大小为 12 字节,并非 6 字节。这是为什么呢?
其实这只是编译器对结构体成员进行了内存对齐的处理,目的是为了方便访问结构体成员。例如,将整个结构体的大小设置为 4 的倍数,并以 4 字节为一个单位对成员进行存储,如果单位内的剩余空间大于成员的大小,就将成员存入该单位,否则就将成员存放于下一单位的内存。如果一个单位存放不下成员,就用多个单位来进行存储。结构体 Person 和结构体 A 的成员存储情况如图 7.1 所示。
图 7.1 结构体 Person 与结构体 A 的成员存储
从图中可见,结构体 A 的第一个成员 a 只占用了第一个单位 4 字节中的第一个字节,第三个成员 c 只占用了第三个单位 4 字节中的第一个字节。
下面,我们在定义结构体 A 时,将成员 b 和成员 c 的位置互换一下。例如:
现在重新打印输出结构体 A 的大小,结果如下:
Size of the struct A: 8 bytes.
结构体 A 的大小变为 8 字节。其中成员 a 和成员 c 都会存储在第一个单位的 4 字节内,而成员 b 则单独占用了第二个单位的 4 字节,如图 7.2 所示。
可见,结构体在定义时,成员位置的不同,会造成结构体大小的不同,这是因为编译器对结构体成员进行内存对齐的原因。
图 7.2 结构体 A 的成员存储
最后要说的是,不同的编译器可能有着不同的内存对齐实现方式,所以读者只要适当了解即可,不必太过纠结。在需要知道结构体大小的时候,只要使用 sizeof 运算符即可。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论