C 语言高级数据结构 之 联合

发布于 2024-06-29 21:44:38 字数 1513 浏览 19 评论 0

当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union),与结构不同,当定义联合时,计算机只为其中一个字段分配空间

在 C Programming Language 一书中对于联合体是这么描述的:

  • 联合体是一个结构
  • 它的所有成员相对于基地址的偏移量都为 0
  • 此结构空间要大到足够容纳最 宽 的成员
  • 其对齐方式要适合其中所有的成员

union U {
    char s[9];  // 占 9 个字节
    int n;      // 占 4 个字节
    double f;   // 占 8 个字节
};
printf("sizeof:%i", sizeof(union U));   // 16

这里定义了一个联合 U,最大占 9 个字符,所以该联合最宽应该是 9,但为啥是 16 呢,这里存在字节对齐的问题,9 既不能被 4 整除,也不能被 8 整除。因此补充字节到 16,这样就符合所有成员的自身对齐了。从这里可以看出联合体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足两个条件:

  • 大小足够容纳最宽的成员
  • 大小能被其包含的所有基本数据类型的大小所整除

参考:浅谈 C 语言中的联合体

1.使用联合

保存第一个字段的值

quantity q = {4};

指定初始化器:按名设置联合字段的值

quantity q = {.weight=1.5};	//

点表示法

quantity q;			// 创建联合变量
q.volume = 4.3;		// 设置字段的值

对于结构的初始化,注意第三种情况:

// 成功
sms m = {2.0, 1.0, {0.7}}; 

//失败
sms m;
m = {2.0, 1.0, {0.7}};

因为 {} 符号结构要和结构声明写在一行,编译器才知道是结构,否则表示数组。

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

无敌元气妹

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

ni139999

文章 0 评论 0

Smile

文章 0 评论 0

木子李

文章 0 评论 0

仅此而已

文章 0 评论 0

qq_2gSKZM

文章 0 评论 0

内心激荡

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文