第 21 讲:联合体
2021-09-26 23:34 作者:SunnieShine | 我要投稿
前文我们描述了结构体的内容,我们知道了结构体需要堆内存的分配模式才可以正常分配变量,记得 free
函数释放,记得判断是否分配成功,还学习了如何使用 sizeof
关键字来获取变量(或结构体类型)的所占内存大小。下面我们来看另外一种模型:联合体(Union)。
不要尝试用联合体
可以通过名字看出,它就是并集的英文名,它和结构体非常相近,但它可能更加奇怪:它的元素储存机制并不是挨着放的,而是从同一点开始。
假如,我们依旧使用 student
作为类型名,不够把关键字改为 union
:
如果我们定义一个变量,并为其分配好内存:
这样就可以了。现在我们按照类似的方式来为联合体的字段赋值:
age
字段赋值 63,而把 name
的第一个字符位置赋值我 A
字符。这已经足以说明问题。现在我们尝试重新输出 age
age
字段的信息,就简单为 name
的第一个字符位置赋值了一下,竟然修改了 age
字段的结果。
联合体在分配内存的时候,是全部都在头部对齐的,这也就意味着,如果我们分配的 a
指针指向内存假设为 0x123
的位置上的话,那么 0x123
就是所有四个字段的起始点。这样一来,修改一处字段,自然就会同时影响到其它字段的结果。

所以,不要尝试使用联合体。
既然这样,联合体有什么样的用途呢?
在非常罕见的情况下,我们需要节约内存。当我们不得不把多个信息点都放在同一个地方存储来节约内容,而且这些信息仅在调用时有效,其它时候根本不用的情况下,可以考虑使用联合体。
不过,这种情况实在是太少了。
联合体的内存大小
前文讲述了结构体的内存大小的计算。联合体的内存大小其实也很好求得。前文已经完全描述了所有有关联合体定义分配内存时候的模式:同时对齐在开头地址。所以它的总大小,取决于所有字段里最“长”的那一个,所以,sizeof(union student)
= 20。