| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1236 人关注过本帖
标题:关于共用体的问题
只看楼主 加入收藏
skysky198344
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2008-10-27
收藏
 问题点数:0 回复次数:13 
关于共用体的问题
下面这个问题,假设结构体中的成员按书写顺序从低字节向高字节排列。
main()
{
   union vvv
   {                                                        我不明白,为什么输出结果是 1,2;
      struct{ int x; char y; }m;
      char a; char b;                                        请指点一下,关于共用体我有不懂之处。
    }k;
    k.a = 2;
    k.b = 1;
    k.m.x = k.a * k.b;
    k.m.y = k.a + k.b;
    printf( "\n%d%d", k.m.x, k.m.y );
}

[[it] 本帖最后由 skysky198344 于 2008-11-3 20:07 编辑 [/it]]
搜索更多相关主题的帖子: _union question 
2008-11-03 20:03
skysky198344
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2008-10-27
收藏
得分:0 
这个是大伙不懂呢?还是都忙呢
2008-11-04 13:33
iamah
Rank: 1
等 级:新手上路
威 望:1
帖 子:69
专家分:0
注 册:2008-10-31
收藏
得分:0 
我回家看看书
2008-11-04 19:13
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1688
专家分:4262
注 册:2007-12-27
收藏
得分:0 
通过看书,你应该了解k.a,k.b,k.m.x这几个东西是重叠在一起的,也就是说它们是同样的内存单元的一些别名。
其中k.a,k.b是单字节,k.m.x长一些。
而k.m.y和前面三个不是重合的,是独立的。
所以考虑到数据比较小的情况下,你的代码近似相当于
x=2;
x=1;
x=x*x;
y=x+x;

OK?

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2008-11-04 19:14
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
共用体公用内存。
m;
a;
b;  
用同一个

倚天照海花无数,流水高山心自知。
2008-11-04 19:35
skysky198344
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2008-10-27
收藏
得分:0 
[bo][un]forever74[/un] 在 2008-11-4 19:14 的发言:[/bo]

通过看书,你应该了解k.a,k.b,k.m.x这几个东西是重叠在一起的,也就是说它们是同样的内存单元的一些别名。
其中k.a,k.b是单字节,k.m.x长一些。
而k.m.y和前面三个不是重合的,是独立的。
所以考虑到数据比较小的 ...


你这个里面说得k.m.y为什么和前面三个不是重合的呢?为什么?因为据我所知,这个共用体中任何一个变量的改变都会导致全部其他变量的改变,至于改变成何值,这个我也是不清楚的。然后你说得k.a和k.b,因为k.b后出现了,所以用k.b来参加运算,我只能这么理解。
2008-11-05 09:08
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
[bo][un]skysky198344[/un] 在 2008-11-5 09:08 的发言:[/bo]



你这个里面说得k.m.y为什么和前面三个不是重合的呢?为什么?因为据我所知,这个共用体中任何一个变量的改变都会导致全部其他变量的改变,至于改变成何值,这个我也是不清楚的。然后你说得k.a和k.b,因为k.b后出 ...

 k.a = 2;
    k.b = 1;//当执行到这条语句时,可以知道,此时的a是没有内存分配的(其实是共用了),所以k.a=1
    k.m.x = k.a * k.b;
    k.m.y = k.a + k.b;

倚天照海花无数,流水高山心自知。
2008-11-05 09:21
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
[bo][un]skysky198344[/un] 在 2008-11-5 09:08 的发言:[/bo]



你这个里面说得k.m.y为什么和前面三个不是重合的呢?为什么?

从内存空间上说,该共用体结构应该至少需要3个字节(其实加上内存对齐问题,它的空间起码是4的倍数),
x, y 的空间相互独立,整体才和a b 重合

倚天照海花无数,流水高山心自知。
2008-11-05 09:26
skysky198344
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2008-10-27
收藏
得分:0 
回复 7# 的帖子
版主解释可以理解了。谢谢你。
2008-11-05 11:10
skysky198344
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2008-10-27
收藏
得分:0 
回复 7# 的帖子
但是我不明白你后半句,就是a为什么没有内存分配了?共用体是以其中某个变量的最大存储空间作为整个的空间,显然结构体的存储需要3个字节,所以整个共用体需要3个字节。那即使k.b调用了1,k.a也是还有2个空间的字节来用啊。这是怎么个原因呢?
2008-11-05 11:15
快速回复:关于共用体的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037602 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved