| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 487 人关注过本帖
标题:关于共用体的一个问题
只看楼主 加入收藏
翼碎
Rank: 1
等 级:新手上路
帖 子:23
专家分:7
注 册:2012-9-5
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
关于共用体的一个问题
程序代码:
#include<stdio.h>

union
{
    char c;
    char i[4];
}z;

main()
{
    z.i[0] = 0x39;
    z.i[1] = 0x36;
    printf("%c\n",z.c);
}

程序代码如上,最后输出结果是9,请问是为什么啊?
2012-09-07 22:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
什么教程上示范这样的共用体代码?

授人以渔,不授人以鱼。
2012-09-07 22:12
翼碎
Rank: 1
等 级:新手上路
帖 子:23
专家分:7
注 册:2012-9-5
收藏
得分:0 
回复 2楼 TonyDeng
做题做到的,问程序的结果是多少,答案是9,我上机试过了,答案是对的……
2012-09-07 22:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你明白共用体的构造原理吗?书上有讲。我说这种代码不妥,不是因为它答案有问题,而是因为这样构造共用体的方式是没有正当理由的。

授人以渔,不授人以鱼。
2012-09-07 22:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这是一个占用4char空间的内存块(以最长的i[4]为值),而在头一个char的位置,这个位置的数据既可以被理解为i[0]的char,也可以被理解为c的char,即这两个变量是同一个东西。因此,代码中给i[0]赋值0x39,就等于给c赋值0x39,将这个内码0x39以字符的格式输出,就是ASCII字符'9'。

[ 本帖最后由 TonyDeng 于 2012-9-7 22:33 编辑 ]

授人以渔,不授人以鱼。
2012-09-07 22:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
共用体的本质,只是同一块内存有几个别名,比如i[0]和c是同一个东西,但变量名称不同。因此,合理的使用方式,是别名占用的尺寸应该一样的。i[4]是数组,占用4char,那么另外的变量也应该占用同样的尺寸才对,像现在这样,c只标识了1char的占用,那么相当于c后面有3char的未知数据,虽然程序员可能知道i[1]、i[2]、i[3]可能是有意义的,但使用共用体的外部代码,却只认为z.c是有意义的,那么他极可能取sizeof(z.c)作为这个共用体的尺寸去操作,那是有风险的。

更不合情理的地方,是这个共用体的两个别名都是char类型数据,那样共用体就没有什么意义了。

[ 本帖最后由 TonyDeng 于 2012-9-7 22:30 编辑 ]

授人以渔,不授人以鱼。
2012-09-07 22:28
翼碎
Rank: 1
等 级:新手上路
帖 子:23
专家分:7
注 册:2012-9-5
收藏
得分:0 
回复 5楼 TonyDeng
嗯,谢谢,共用体用的不是很多,学的也不是很透,只是知道一些基础的定义和引用之类的,所以碰到这方面的东西就有点儿小纠结了
2012-09-07 22:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
共用体是能免则免的,考试没办法就算了,平时写程序少用为佳。

授人以渔,不授人以鱼。
2012-09-07 22:35
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
其实有时也不能怨学生,有些书和试题出得太二了

总有那身价贱的人给作业贴回复完整的代码
2012-09-07 23:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看那些考题,我不知道过了的学生能编出什么程序。怎么会考那样的东西!

授人以渔,不授人以鱼。
2012-09-07 23:56
快速回复:关于共用体的一个问题
数据加载中...
 
   



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

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