鱼C论坛

 找回密码
 立即注册
查看: 734|回复: 1

[已解决]求助一个共用体问题

[复制链接]
发表于 2021-3-4 17:15:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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 11:42:51
本帖最后由 墙里秋千墙外荡 于 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;
};
如果令
union data a = {0X40};
其中就有n=64,ch='@',m=64
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-5 11:42:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 墙里秋千墙外荡 于 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;
};
如果令
union data a = {0X40};
其中就有n=64,ch='@',m=64
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 11:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表