#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了吗?
关于 C语言 共用体(联合体) 元素覆盖问题
答案:4 悬赏:0 手机版
解决时间 2021-01-30 13:50
- 提问者网友:相思似海深
- 2021-01-29 17:41
最佳答案
- 五星知识达人网友:孤独的牧羊人
- 2021-01-29 17:54
共用体内的数据在内存的起始地址是相同的,长度与最大的类型相同。
你的程序,虽然第一次赋值r[0]=2,但是r[0]的地址和k的地址相同,
所以k=20这个语句执行后r[0]也等于20了。
你的程序,虽然第一次赋值r[0]=2,但是r[0]的地址和k的地址相同,
所以k=20这个语句执行后r[0]也等于20了。
全部回答
- 1楼网友:山君与见山
- 2021-01-29 20:05
改成: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]);
- 2楼网友:人類模型
- 2021-01-29 19:45
共用共用,就是不同名字的变量占用同一个内存地址
- 3楼网友:野慌
- 2021-01-29 18:10
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
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯