求助:关于共用体的问题,对内存理解还是不够很浅

nju永远得不到的男人 2018-10-29 03:29:56
[code=c]#include<stdio.h>
int main(){
union{
int a[2];
long b;
char c[4];
}s;
s.a[0]=0x39;
s.a[1]=0x38;
printf("%lx,",s.b);
printf("%o\n",s.c[0]);
}[/code

麻烦各位大佬讲解讲解,谢谢!

...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢以上大佬不吝赐教,我点数不多,给不了各位很多点数,抱歉,还是非常感谢各位。
636f6c696e 2018-10-30
  • 打赏
  • 举报
回复
结构体赋值后,内存取值如下: 基地址 39 基地址+2 00 基地址+4 00 基地址+6 00 基地址+8 38 基地址+10 00 基地址+12 00 基地址+14 00 所以s.b的值为0000003800000039 s.c[0]的值为0x39
AlbertS 2018-10-30
  • 打赏
  • 举报
回复
共用体取自本意,就是共用,也就是共用体中的几个变量占用相同的内存,只是几个变量由于类型不同,看到的内容也不同
比如一个杯子就是一个容器,那往杯子里装满水就是给杯子赋值,对于变量水来说这就是一杯水,同时可以从微观来看,他们是水分子的集合,可以看做是水分子的数组,也就是杯子这个容器,可以用宏观的水表示其内容,也可用水分子数组表示其内容,但内容没变,只是你怎么看
只此冒泡君 2018-10-29
  • 打赏
  • 举报
回复
共用体s 在内存中申请了内存空间 假如是 1000 - 1007 这8个字节被 a[2], b, c[4] 共同使用。 你对a[0] a[1] 进行赋值。也就是8个字节都有了内容。 假如long b 是四个字节的 1000 - 1003 内存中的值就是 b的值 c[4] 占用四个字节 1000 - 1003 打印c[0] 实际是打印1000内存里的值。
共用体申请内存空间是按照里面最大的空间来的。
赵4老师 2018-10-29
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
char buf[17];
union U {
unsigned short int aa;
struct {
unsigned int bb:7;//(bit 0-6)
unsigned int cc:6;//(bit 7-12)
unsigned int dd:3;//(bit 13-15)
};
} u;
void main() {
//bbbbbbbbbbbbbbbb
//iiiiiiiiiiiiiiii
//tttttttttttttttt
//111111
//5432109876543210
//::::::::::::::::
u.aa=0xE07F;//1110000001111111
printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);
u.bb=0x41;
u.cc=0x21;//dddccccccbbbbbbb
u.dd=5; //1011000011000001
printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2));
}
//bb==127,cc==0,dd==7
//aa==0xB0C1==1011000011000001(2)

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧