码迷,mamicode.com
首页 > 编程语言 > 详细

【C语言学习】union关键字

时间:2015-03-03 16:45:42      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

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结构体的取值,例如大端模式和小端模式。

【C语言学习】union关键字

标签:

原文地址:http://blog.csdn.net/wichow/article/details/44038939

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!