| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1107 人关注过本帖
标题:共用体成员输出问题,结果怎么是13??我怎么也想不明白
只看楼主 加入收藏
粉jj
Rank: 2
等 级:论坛游民
威 望:1
帖 子:123
专家分:82
注 册:2011-3-8
结帖率:85.11%
收藏
 问题点数:0 回复次数:5 
共用体成员输出问题,结果怎么是13??我怎么也想不明白
共用体不是最后赋值的成员才是有效存放的嘛?怎么输出是13呢??

#include<stdio.h>
union pw
{int i;char ch[2];}a;
main()
{a.ch[0]=13;a.ch[1]=0;printf("%d\n",a.i);}



[ 本帖最后由 粉jj 于 2011-12-13 11:55 编辑 ]
2011-12-13 11:05
半个灵魂
Rank: 2
等 级:论坛游民
帖 子:13
专家分:11
注 册:2011-11-17
收藏
得分:0 
有效存放的是整个数组里面的所有成员,ch[0]的起始地址和 i 相同,所以 a.i=13而不是0.
2011-12-13 12:34
共和国鹰派
Rank: 3Rank: 3
来 自:山东
等 级:论坛游侠
帖 子:37
专家分:119
注 册:2011-10-20
收藏
得分:0 
因为char[2]是这个UNion中的一员,当你输入a.ch[0]=13;a.ch[1]=0;实际上此时这个联合体内存储的是一个char型的字符串,而一个char型字符串是无法转换为Int数据的,所以取得了第一个char元素转换为int型输出了
2011-12-13 17:28
张敏樱木花道
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:139
专家分:137
注 册:2011-3-26
收藏
得分:0 
数据都在内存中,只是显示的长度不同而已,如果你有内存模型的概念这个问题就很好理解了!
另外对于3楼的“char型字符串是无法转换为Int数据的,所以取得了第一个char元素转换为int型输出了”持怀疑的态度,我觉得如果让ch[1]!=0,那么三楼的预计结果也是13。由于环境问题没有办法验证,希望那位朋友告诉以下结果
2011-12-13 18:00
a771270076
Rank: 2
等 级:论坛游民
帖 子:5
专家分:23
注 册:2011-12-9
收藏
得分:0 
共用体最大的特点就是共占一块内存,就来在TC环境下来说,你的这个共用体占2个字节
ch[0]=13作为一个字符类型当然是占一个字节,在内存中的:0000 1101
ch[1] 在内存中:0000 0000
你输出的是int 类型的,在TC中占2个字节,所以其值为 0000 0000 0000 1101(2)  结果当然是13
2011-12-13 19:03
luchar
Rank: 9Rank: 9Rank: 9
来 自:南京
等 级:蜘蛛侠
帖 子:279
专家分:1263
注 册:2011-11-3
收藏
得分:0 
因为共用体是不同的存储类型用相同的内存区间,当然这些区间只能存储一类数据,就拿这里来说;
分配了一个16个二进制位的内存单元给a,则int i和char ch[2]共同用这些单元

这个要看编译器处理内存的方式了,在vc6下面,如果把;a.ch[1]=1,则得到结果是269。
把是13转成二进制是0000 1101,而1转成二进制是0000 0001
int型占两个字节,就是16个二进制位,刚好和ch[2]的大小相同,就把这16位完整的使用,成了0000 0001 0000 1101,就是十进制的269,可见他是ch[0]在后面,ch[1]在前面的。
2011-12-13 19:13
快速回复:共用体成员输出问题,结果怎么是13??我怎么也想不明白
数据加载中...
 
   



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

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