返回介绍

7.1.5 结构体的大小

发布于 2025-04-11 22:33:02 字数 2227 浏览 0 评论 0 收藏 0

基本数据类型具有相对固定的大小,而结构体是复合数据类型,它的成员的类型、数量是不固定的,那么一个结构体的大小是多少呢?可以通过 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。