返回介绍

7.3.2 联合体的大小

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

前面说过,联合体与结构体的主要区别就在内存存储上。结构体的每个成员都拥有自己独立的内存空间,结构体大小为所有成员的大小之和(不考虑内存对齐的情况)。而联合体的所有成员都使用同一段内存空间,联合体大小即为联合体中最大的那个成员大小。例如联合体 A 的 3 个成员中,最大的成员是 c,它是 double 类型的,大小为 8 字节。因此,联合体 A 的大小就是成员 c 的大小。我们可以通过 sizeof 运算符来获取联合体 A 的大小。例如:

printf("Size of the union A: %u bytes.\n", sizeof(union A));

通过 printf 函数来打印联合体 A 的大小,和结构体类型类似,大家要注意,在 sizeof 运算符的小括号内,联合体 A 的类型应该写为“union A”,关键字“union”不能被省略掉。

编译运行程序,结果如下:

Size of the union A: 8 bytes.

可见,联合体 A 的大小为 8 字节,与成员 c 的大小相同。其成员的内存存储情况,如图 7.3 所示。

图 7.3 联合体 A 的成员存储

从图中可以发现,成员 a、b、c 都是使用相同的一段 8 字节的内存空间。这样做的最大好处,就是能够节省内存。但是,需要注意的是,我们不应同时对多个成员进行存储,例如,若存储了成员 a 的数据,当再存储成员 b 的数据时,就会覆盖原先成员 a 的数据,而存储成员 c 的数据时,同样也会覆盖原先成员 b 或者成员 a 的数据。因此,是不可能在一个联合体中同时存储不同的成员值的,即在一个联合体中,某一时刻,只能存储某一成员的值。

另外,从访问角度来看,对于这 8 字节内存数据,如果以成员 a 来进行访问,只能访问第一个字节中的数据;如果以成员 b 来进行访问,则能访问前 4 字节中的数据;而若以成员 c 来进行访问,则能访问全部 8 字节的数据。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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