什么是联合体
联合(union)是一种数据类型,它能在同一个内存空间中存储不同的数据类型(不是同时存储)其典型的用法是,设计一种表以存储既无规律、事先也不知道顺序的混合类型。使用联合类型的数组,其中的联合都大小相等,每个联合可以存储各种数据类型。。联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
联合类型的定义
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
//联合类型的声明 union Un { char c; int i; }; //联合变量的定义 union Un un;
联合体的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
union Un { int i; char c; }; union Un un; int main() { printf("%d\n", &(un.i)); printf("%d\n", &(un.c)); system("pause"); return 0; }
由此可见,i 和 c都在共用一块空间。
所以对于联合体来说同一时间只能使用一个,如果两个一起使用的话,他们共用同一块空间,改变一个,另外一个也会跟着改变,内存会被覆盖掉了.
- 面试题:
- 判断当前计算机的大小端存储
un联合体 占四个字节(下面会讲到如何计算),如果是 把i 赋成1 按照小端存放就是 01 00 00 00,在判断 u.c 是否等于1(char类型只读取一个字节数据,) 如果等于1 就是小端,反之就是大端存储
#include<stdio.h> union Un { int i; char c; }; union Un un; int main() { un.i = 1; if (un.c == 1) { printf("小端存储\n"); } else { printf("大端存储\n"); } return 0; }
那联合体大小该如何计算呢?
联合大小的计算
- 联合的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
- 联合也是需要内存对齐的
- 请看下面的例子:
#include<stdio.h> #include<stdlib.h> union Un1 { char c[5]; int i; }; union Un2 { short c[7]; int i; }; //下面输出的结果是什么? int main { printf("%d\n", sizeof(union Un1)); printf("%d\n", sizeof(union Un2)); return 0; }
- printf(“%d\n”, sizeof(union Un1));
答案是-> 8
因为要对齐最大对齐数整数倍,中间浪费了几个空间
- printf(“%d\n”, sizeof(union Un2));
答案是-> 16