c语言中共用体的关键字为union,解释为一种特殊的构造数据类型。其定义方式和类型说明和结构体非常相识。但是具体实例化时在内存方面,union和struct却完全不同。
struct 是按照成员类型,如果没有指定对齐方式的情况下,会以默认方式对齐。但是union则不一样,它是所有成员公用一段内存。为成员中最大的元素分配内存。
如例一: union UN_1
{
int a;
float b;
double c;
}u1={45};
大部分编译情况下,int=4Byte;float=4Byte ;double=8Byte。
初步断定,则该共用体是占用8Byte,再考虑对齐要素,该union最大的元素为8。初步计算union的长度为8,8/8=0;故该共用体的长度为8个Byte。
如例二: union UN_2
{
char a_1[10];
float b_1;
double c_1;
}u2={45.0};
此时char a_1[10],占用10个字节,故初步该union变量至少需要10个Byte,去存储。然后考虑到该结构体的最大对齐数=基类型数据最大的数据=double=8Byte。10/8!=0,故该结构体必须往后延长。16/8=0。故该union的长度为16个字节。
例二中,我在定义结构体类型时,同时定义了结构体变量,还对变量进行了初始化化。接下来我们在主函数中打印结构体变量的成员值
int main()
{
printf("u.a的值%d\n",u1.a);
printf("u.b的值%f\n",u1.b);
printf("u.c的值%f\n",u1.c);
return 0;
}
看结果
发现没有,系统默将初始化的{45};赋值给第一个成员int a。其他成员默认为0.
接下来修改
例三:
union UN_3
{
char a_2[10];
float b_2;
double c_2;
}u2={45.0,46.0,47.0};
再看测试结果:。一样的会忽略后面的46.0和47.0。
union还有一个问题
例四:
#include <stdio.h>
#include <stdlib.h>
union UN_4
{
unsigned int a_3;
float b_3;
double c_3;
};
int main()
{
union UN_4 u3; //定义一个共用体变量u3
u3.a_3=10;
printf("输出 u3.a_3所占用字节的大小%d\n",sizeof(u3.a_3)); //打印出 u3.a_3所占字节的大小
printf("输出u3的大小%d\n",sizeof(u3));
u3.b_3= -40.0; //C规范定义float类型数据,最高BIT位,必须是符号位。故编译器在编译时,必须
//要在不同的时候,分配不同的8个字节中,最高位的意义
printf("输出 u3.b_3所占用字节的大小%d\n",sizeof(u3.b_3)); //打印出 u3.b_3所占字节的大小
u3.c_3 = -50.0;
printf("输出 u3.c_3所占用字节的大小%d\n",sizeof(u3.c_3)); //打印出 u3.c_3所占字节的大小
}
看输出结果:
这里还有一个知识点,当用sizeof(),计算union变量的成员变量的大小时。并不是8Byte。这一点需要特别注意。