c语言中,联合是一种特殊的自定义类型,这些类型定义的变量也包含一系列的成员,但在联合中,这些成员共同用一块空间。所以联合,也叫做共同体。

联合的所有成员共用一块内存空间,因此一个联合变量的大小最小是其最大成员的大小(考虑到内存对齐等因素,实际大小可能会稍大一些)。在同一时间,联合中只能存储一个成员的值,当给联合中的一个成员赋值后,其他成员的值将变得不可预测。

(内存对齐: 当联合中最大成员的大小不是默认对齐数的整数倍,就要对齐到默认对齐数的整数倍上)

##c联合_内存对齐

结构体三个成员位于相同的地址;

一.定义

union 联合名称 
{
    数据类型1 成员1;
    数据类型2 成员2;
    // ... 其他成员
};

声明:

union 联合名称 变量名;

也可以在定义联合的同时声明变量:

union {
    数据类型1 成员1;
    数据类型2 成员2;
    // ... 其他成员
} 变量名;

       二.使用

与访问结构体相同,联合也通过' . ' 来访问;


//通过联合判断机器是大端还是小端
char check()
{
	union un//共用同一块空间
	{
		char c;
		int i;
	}un;

	un.i = 1;//整型
	return un.c;//因为联合共用一块空间,所以i储存值的位置与c相同
  //而c是char类型,一次只能对1字节进行操作,所以如果c == 1那么就证明机器是以小端的方式进行储存的
}

int main()
{
	int a = 1;
	if (check() == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

在使用联合时,当联合不同成员的长度相差悬殊,存储长度较短的成员时,会浪费一部分空间。在这种情况下,可以在联合中存储指向不同成员的指针而不是直接存储成员本身。所有指针的长度都是相同的,这样就避免了内存浪费的问题。