欢迎光临散文网 会员登陆 & 注册

第 21 讲:联合体

2021-09-26 23:34 作者:SunnieShine  | 我要投稿

前文我们描述了结构体的内容,我们知道了结构体需要堆内存的分配模式才可以正常分配变量,记得 free 函数释放,记得判断是否分配成功,还学习了如何使用 sizeof 关键字来获取变量(或结构体类型)的所占内存大小。下面我们来看另外一种模型:联合体(Union)。


不要尝试用联合体

可以通过名字看出,它就是并集的英文名,它和结构体非常相近,但它可能更加奇怪:它的元素储存机制并不是挨着放的,而是从同一点开始。

假如,我们依旧使用 student 作为类型名,不够把关键字改为 union

如果我们定义一个变量,并为其分配好内存:

这样就可以了。现在我们按照类似的方式来为联合体的字段赋值:

我们并没有为其把所有字段都赋好值,而仅为 age 字段赋值 63,而把 name 的第一个字符位置赋值我 A 字符。这已经足以说明问题。现在我们尝试重新输出 age 字段结果,你就会发现奇怪的地方。

此时,你会发现输出结果一定不会是 63,而是一个非常大的数。这很奇怪,因为我们在赋值了 63 后再也没动过 age 字段的信息,就简单为 name 的第一个字符位置赋值了一下,竟然修改了 age 字段的结果。

联合体在分配内存的时候,是全部都在头部对齐的,这也就意味着,如果我们分配的 a 指针指向内存假设为 0x123 的位置上的话,那么 0x123 就是所有四个字段的起始点。这样一来,修改一处字段,自然就会同时影响到其它字段的结果。

所以,不要尝试使用联合体。


既然这样,联合体有什么样的用途呢?

在非常罕见的情况下,我们需要节约内存。当我们不得不把多个信息点都放在同一个地方存储来节约内容,而且这些信息仅在调用时有效,其它时候根本不用的情况下,可以考虑使用联合体。

不过,这种情况实在是太少了。


联合体的内存大小

前文讲述了结构体的内存大小的计算。联合体的内存大小其实也很好求得。前文已经完全描述了所有有关联合体定义分配内存时候的模式:同时对齐在开头地址。所以它的总大小,取决于所有字段里最“长”的那一个,所以,sizeof(union student) = 20。


第 21 讲:联合体的评论 (共 条)

分享到微博请遵守国家法律