下午好诶,今天小眼神给大家带来一篇C语言联合体详解的文章~
目录
联合体
1. 联合体类型的声明
2. 联合体的特点
代码一:
代码二:
3. 相同成员的结构体和联合体对比
编辑4. 联合体大小的计算
5. 联合体的优点
联合体
1. 联合体类型的声明
与我们之前学的结构体很相似,联合体也是由一个或者多个成员组成的,并且成员之间的类型可以不同。
联合体与结构体不同的是,联合体的组成成员所占用内存空间是同一块内存空间,并且,编译器只为最大的成员分配足够多的内存空间,所以联合体也叫做:共用体。
若是
给联合体其中一个成员赋值,其他成员的数值也会跟着变化。
#include<stdio.h>
union Un
{
char a;
int i;
};
int main()
{
union Un un = { 0 };
printf("%d\n", sizeof(un));//4
return 0;
}
输出结果: 4
如果是结构体,这里应该输出结果为8,但结构体内成员共用一块空间,只为最大的成员分配足够多的内存空间,所以这里只给 i 分配了4个空间,a存储在 i 的空间中。
2. 联合体的特点
联合体成员共用一个内存空间,那么一定要保证最大的成员要装下,所以,这样的联合变量的大小,至少是最大成员的大小(因为联合体至少有能力保存最大的那个成员)
代码一:
#include<stdio.h>
union Un
{
char a;
int i;
};
int main()
{
union Un un = { 0 };
printf("%d\n", sizeof(un));//4
printf("%d\n", sizeof(un.a));//1
printf("%d\n", sizeof(un.i));//4
printf("%p\n", &un);
printf("%p\n", &(un.a));
printf("%p\n", &(un.i));
return 0;
}
输出结果:
4
1
4
0078FDF4
0078FDF4
0078FDF4
那么我们可以看到,联合体及其各个成员们的地址都是一样的,那么我们可以推测,是否所有的非最大成员都在首地址处存放呢?
代码二:
#include<stdio.h>
union Un
{
char a;
int i;
};
int main()
{
union Un un = { 0 };
un.i = 0x11223344;
un.a = 0x55;
printf("%x\n", un.i);
return 0;
}
让我们调试上述代码来看看:
通过内存监视,我们可以发现:i 的第四个字节内容被修改成 55 了,我们可以分析出以下 un 的内存布局图:
3. 相同成员的结构体和联合体对比
union S
{
char a;
int i;
};
struct S s = { 0 };
struct Un
{
char a;
int i;
};
struct Un un = { 0 };
相同成员的情况下,结构体和联合体的内存分布情况:
结构体和联合体的内存对比
4. 联合体大小的计算
1. 联合体的大小至少是成员的大小
2. 当最大成员大小不是对齐数的整数倍的时候,就要将最大成员大小对齐到最大对齐数的整数倍。
#include<stdio.h>
union S1
{
char a[5];
int i;
};
union S2
{
short c[7];
int i;
};
int main()
{
printf("%d\n", sizeof(union S1));
printf("%d\n", sizeof(union S2));
return 0;
}
5. 联合体的优点
使用联合体是可以节省空间的,例如我们要统计三种商品数据:图书,杯子,衬衫。
每一种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
图书:书名、作者、页数
杯子:设计
衬衫:设计、可选颜色、可选尺寸
如果我们用结构体来写的话:
#include<stdio.h>
struct my_list
{
int stock_number;//库存量
double price;//价格
int item_type;//商品类型
char title[20];//书名
char author[20];//作者
int num_pages;//页数
char design[30];//设计
int colors;//颜色
int sizes;//尺寸
};
上述结构设计简单用起来方便,但结构的设计中包含了所有商品的各种属性,这样会使得结构体的大小过大,很浪费内存。因为对于各自商品,只有部分属性信息是常用的:
商品是图书,就不需要design、colors、sizes。
所以,我们可以把公共属性单独写出来,用联合体把各种商品本身的属性括起来,这样可以在一定程度上节省内存。
#include<stdio.h>
struct my_list
{
//公共属性
int stock_number;//库存量
double price;//价格
int item_type;//商品类型
union
{
struct//匿名
{
char title[20];//书名
char author[20];//作者
int num_pages;//页数
}book;
struct
{
char design[30];//设计
}mug;
struct
{
int colors;//颜色
int sizes;//尺寸
}shirt;
}item;
};
感谢阅读本篇文章
希望能对您解题有所帮助,记得点赞关注收藏 !