最近开始自学C语言,从最基础部分的开始学起。今天看书的时候注意到了struct和union似乎很像,除了名字不同,看起来几乎没有区别。
既然C中定义了struct和union两个关键字,那么它们肯定是有区别的,在查了一些资料之后我终于知道两者最大的区别就在于内存利用。
首先看下面一段程序:
#include<stdio.h>
union uni
{
int a;
char b;
};
struct str
{
int a;
char b;
};
int main(int argc, char** argv)
{
printf("%d %d\n", sizeof(union uni), sizeof(struct str));
return 0;
}
程序编译运行之后输出结果为:
4 8
由此可见,在成员完全相同的情况下,struct比union占用的内存要多一些。真正的原因是C中struct和union的内存分配机制不同:
在struct中,所有的成员都有自己的存储空间,而且为了便于寻址和管理,所有的数据成员都要遵循内存对齐的规则;
在union中,所有的成员共用一块存储空间,在操作不同的成员时,编译器依据不同的成员类型,按照不同的方式取值,具体例子见以下代码:
#include <stdio.h>
int main(int argc, char** argv)
{
union
{
short i;
struct
{
char a;
char b;
}str;
}uni;
uni.i = 0x4241;
printf("%c%c\n", uni.str.a, uni.str.b);
uni.str.a = 'a';
uni.str.b = 'b';
printf("%x\n", uni.i);
return 0;
}
程序编译运行之后输出为:
AB
6261
很显然,我们对union中的某个成员进行的操作能够影响到其他成员。