【C语言学习】union关键字

union关键字与struct关键字的用法很相似,先看例子:

#include <stdio.h>

int main(void)
{
	/*struct结构体*/
	struct
	{
		int i;
		char a[4];
	}s;

	/*union结构体*/
	union
	{
	   int i;
	   char a[4];
	}u;

	printf("sizeof(int)=%d\n",sizeof(int));

	/*s结构体赋值*/
	s.a[0] = 0x00;
	s.a[1] = 0x01;
	s.a[2] = 0x00;
	s.a[3] = 0x00;
	printf("s.i=%d\n",s.i);
	
	/*u结构体赋值*/
	u.a[0] = 0x00;
	u.a[1] = 0x01;
	u.a[2] = 0x00;
	u.a[3] = 0x00;
	printf("u.i=%d\n",u.i);
}

打印结果:

sizeof(int)=4

s.i=-858993460

u.i=256

按照以上例子,s结构体所占用的内存结构为8个字节:

技术分享

S结构体赋值后的内存结构为:

技术分享

u结构所占用的内存结构为4个字节:

技术分享

u结构体赋值后的内存结构为:

技术分享

样是结构体,struct和union的差别就在于内存的分配。struct的内存分配是成员内存的总和,如s结构体一共占int+char[4]=4+4=8个字节。而union 只配置一个足够大的空间用来容纳最大长度的数据成员,也就是union最大占用内存的成员就是这个union结构体的最大内存。换句话说,这个union的内存是各个成员公用的,例如以上例子,u结构体的成员变量有int和char数组,长度分别为4,4。u占用的内存去成员变量的最大占用内存值,所以还是4个字节。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0 处开始,当给u的char数组赋值的时候,就从u的字节低位(基地址)开始分配。赋值后,在打印u.i的时候就是从联合体u获取i的值,根据union的规则,内存是公共的,也是从该联合体基地址的偏移量为0 处开始获取4个字节。根据u赋值后的内存结构当整数来处理就相当于256了。而s.i是没有赋值的,只能获取随机数。

总结:union的好处就是节省了内存空间,不过还是得看场合使用。

注意:系统的存储模式会直接影响union结构体的取值,例如大端模式和小端模式。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。