目录
简介
C语言中的联合体Union可以说是非常冷门的一个关键字了,平时基本不怎么会用到。它的定义格式如下:
union 联合体名{
成员列表
};
例如:
union data{
int n;
char ch;
double f;
};
可以看到联合体union和常用的结构体struct在定义上非常相似。二者的区别如下:
1.结构体的各个成员会占用不同的内存,互相之间没有影响;而联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
2.结构体占用的内存大于等于所有成员占用的内存的总和(字节对齐问题);联合体占用的内存等于最长的成员占用的内存。
可以看到联合体和结构体最大的区别就在于联合体内所有成员公用同一块内存,这也就导致联合体内保存指针成员会变得非常危险。
案例分析
最近在debug一个空指针异常时,遇到了类似如下代码:
#include <stdio.h>
union Test
{
int *a;
unsigned x;
};
int main()
{
union Test t;
int i = 0;
t.a = &i;
printf("%p %d\n", t.a, *(t.a));
t.x = 1;
printf("%p %d\n", t.a, *(t.a));
return 0;
}
可以看到联合体Test的成员有两个: