马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<stdio.h>
union exx
{
int a; //共用体成员表列
int b;
struct
{
int c; //结构体成员表列
int d;
}lpp; //结构体变量
}e = {10}; //共用体变量
int main()
{
e.b = e.a + 20;
e.lpp.c = e.a + e.b;
e.lpp.d = e.a * e.b;
printf("%d,%d\n",e.lpp.c,e.lpp.d);
return 0;
}
大佬们,这里的e = {10}; 这是啥意思,为什么要加上 {} 呢;
我理解的这就是给 变量e赋值 使e = 10。所以共用体里面的a,b都变成10。再继续执行
本帖最后由 墙里秋千墙外荡 于 2021-3-5 16:52 编辑
首先确实是赋值操作
其中{}是结构体,数组,共用体等数据结构初始化的一种方法,在这里e并不是一个简单的数据类型,他本身具有多个成员,使用不能简单的进行e=10的初始化操作。这里e={10}的意思就是e中的第一个成员初始化为10,{}的作用是用来分组,方便机器识别,也简化代码。
下面我简单描述一下共用体:
共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员,共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
你的代码中共用体占据的内存大小就是8个字节,也就是结构体lpp的内存大小,结构体和共用体的区别在于结构体的各个成员会占用不同的内存,互相之间没有影响。
在这个共用体中前4个字节的内存空间由a,b,c三个变量共同使用,后4个字节的内存空间由d占据。
如果未对这段内存空间进行初始化,在调试环境下,内存中的数据将是0XCC,如果是在真实环境下可能为分配的内存空间中的垃圾数据。
在取用的时候计算机会根据各变量的类型不同进行相应的解析,得到可能不一样的输出结果。
例如 union data{
int n;
char ch;
short m;
};
如果令 其中就有n=64,ch='@',m=64
|