永发信息网

关于 C语言 共用体(联合体) 元素覆盖问题

答案:4  悬赏:0  手机版
解决时间 2021-01-30 13:50
#include "stdio.h"
main()
{
union
{char c[2];
int k;
}r;
r.c[0]='2';r.c[1]='0';r.k=20;
printf("%d,%d,%d\n",r.k,r.c[0],r.c[1]);
}

为什么输出20,20,0 ??

r.c[0]为什么是20?

r.k为什么不是(16进制) 00 00 00 14 这样存储?如果是这样不就 r.c[0],r.c[1])都是0了吗?
最佳答案
共用体内的数据在内存的起始地址是相同的,长度与最大的类型相同。
你的程序,虽然第一次赋值r[0]=2,但是r[0]的地址和k的地址相同,
所以k=20这个语句执行后r[0]也等于20了。
全部回答
改成:r.k=20;r.c[0]='2';r.c[1]='0'; 的赋值顺序,再试试,理解了吗? 修改printf("%d,%d,%d\n",r.k,r.c[0],r.c[1]);为:printf("%d,%c,%c\n",r.k,r.c[0],r.c[1]);
共用共用,就是不同名字的变量占用同一个内存地址
union { int i; struct { char first; char second; }half; }number; 这里面相当于两个元素,一个元素int 占四个字节(早期是两个字节) 一个元素是结构体类型的占有两个字节其中低八位是char first 高八位为char second; 这两个元素公用一段内存空间,当你把i = 0x4241的时候i的内存表示形式为0x4241高八位为0x42而低八位为0x41而正好大写字母A的ascall 值为0x41 而B为0x42 后面的也就类似这样解释。 楼主你其实可以把上面的 number.half.first='a'; number.half.second='b';试着只用一行语句而不两行同时使用的结果。 比如把上面number.half.first='a'; 注释掉,结果就变成了高八位为0x62 而低八位还是0x41 所以结果输出就会改变为6241
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
停车场(桃园路)(桃园路18号附近停车场)怎么去
三台县协和乡中心小学校怎么去啊,有知道地址
【煮元宵】正月十五煮元宵纷纷落水的意思一丈
黑莓9630的管理链接在哪里
车钥匙掉在车里,人在车上,怎么找钥匙
16岁男生。准高二男生长相会和成年后变化吗?
金杨新村二街坊东门(人行门)在哪里啊,我有事
身份证照片没有录入电脑需要本人回去重新办理
贱贫的意思是什么啊?知道的请说下!
北票市殡仪馆(朝阳北票市五间房镇庄头营村)地
停车场(团结街)(团结街与建新路交叉口东50米
漆器是怎么做出来的?
想生男孩,为何要老公多吃酸性食物?
气动冲床与气泵的比例
图1-1-16是一幅经纬网格图,据此回答下列小
推荐资讯
银河商务中心停车场(公园中路572号银河商务中
德佳装潢材料地址在哪,我要去那里办事
蒙古人特点
狗听到主人唤它的名字就跑过来,是()。A.无条
应收金额是什么意思
重庆大学的体育类专业好不
得仙的意思是什么啊?知道的请说下!
将46g钠放入足量水中,在加入95g氯化镁,会生成
挛结的意思是什么啊?知道的请说下!
京东退款为什么两天还没到?
自己整个鱼缸 长2m 高1.2 宽1米 需要多厚的玻
长安汽车金湖鑫诚专营店地址有知道的么?有点
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?