目录
一.联合体的基本概念
二.相关面试题
三.联合体大小计算
关于结构体的内存对齐:http://t.csdn.cn/fbQuo
一.联合体的基本概念
联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
//联合类型的声明 union Un { char c; int i; }; //联合变量的定义 union Un un;
union是声明联合体类型的关键字,Un是联合体类型名.
该联合体的内存布局示意图:
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
由于联合体所有的成员变量的首地址都是相同的,所以使用联合体变量时,一次只能使用其一个成员变量(因为只要我们修改一个联合体成员变量的内容,其他所有成员变量的内容都会被改变)
union Un { int i; char c; }; union Un un; // 下面输出的结果是一样的吗? int main () { printf("%d\n", &(un.i)); printf("%d\n", &(un.c)); return 0; }
union Un { int i; char c; }; union Un un; int main() { un.i = 0x11223344; un.c = 0x55; printf("%x\n", un.i); 分别修改两次成员变量。 return 0; }
二.相关面试题
用联合体实现一个程序用于判断当前计算机的大小端存储字节序:
typedef union Judge { int i; char c; }Judge; int Sys_Judge(void) { Judge Un = { 0 }; Un.c = 1; return Un.c; } int main() { if (1 == Sys_Judge()) { printf("操作系统为小端存储\n"); } else { printf("操作系统为大端存储\n"); } return 0; }
三.联合体大小计算
1.联合的大小至少是最大成员的大小。
2.当最大成员大小不是该联合体的最大对齐数的整数倍的时候,联合体的总大小要补足到最大对齐数的整数倍(这时联合体内部就会有未被任何成员利用的字节空间)。
(联合体成员的对齐数定义与结构体相同)比如:
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; }
Un2可做类似分析。