c语言中的共用体

 我来答
翦骏英沈怀
2020-02-17 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:34%
帮助的人:961万
展开全部
我测试了一下
int为32bit
,long为32位
,char为8位机测试。
分析得出这样的结果:

这正如共用结构体中
假如他们的共用首地址为0x10000000
那么

地址
变量

0x10000000:
a[0]
如果执行语句
s.a[0]=0x39

0x10000004:
a[1]
相差4个字节
那么会产生如下变化:

0x10000000:
b
a[0]=0x39
b[0]=0x39
c[0]=0x39(
字符c[0]="9")

0x10000000:
c[0]
如果再执行语句
s.a[1]=0x38

0x10000001:
c[1]
那么会产生如下变化:

0x10000002:
c[2]
a[1]=0x38

0x10000003:
c[3]
相差1个字节

也即是地址0x10000000到0x10000003中的数据为0x00000039

也即是地址0x10000004到0x10000007中的数据为0x00000038

虽然是共用体,但是a
b
c同用了一个地址
如果对a赋值了也同时对b和c赋值
只是数据类型不同而已。

如果从地址上来分析
c如果定义的是c[8],那么c[5]地址即为0x10000004
它的值就因该为0x38,因为和a[1]的地址相同。

查看b的是后可以直接用%d来查看
因为在本机上也是32bit和int相同
喜鲲党北晶
2020-02-18 · TA获得超过3720个赞
知道大有可为答主
回答量:3036
采纳率:26%
帮助的人:222万
展开全部
你这个是16位的程序吧,在32位编译器如VC6下,结果不会正确。原因是int在16位下是2个字节(如TC2.0),在32位编译器(如VC6)是4字节。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
斋霖冉柔婉
2020-02-18 · TA获得超过4021个赞
知道大有可为答主
回答量:3131
采纳率:33%
帮助的人:230万
展开全部
结果是770
共用体只有一个存储空间,各共用体变量共用这一个存储空间。在你的程序中,c变量已经使用了共用体的空间存储了2和3,此时,共用体变量的空间状态是:0x00000302。然后你的程序printf("%d",x.i);以int形式输出,那么输出的就是0x00000302,转换成十进制就是770
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
苑余殷运浩
2020-02-26 · TA获得超过3899个赞
知道大有可为答主
回答量:3171
采纳率:32%
帮助的人:193万
展开全部
(1)数组是顺序存储的,所以a[1]位于a[0]的后边,a[1]相对a[0]位于高地址,int型占两个字节,所以a[0]中对应的数实际上是0039,a[1]中实际上是0038.
(2)共用体的内存是共享的,也就是说数组a和long型的b以及char型的c是占用的同一段内存,你指定了a的值,实际上b和c的值也就有了
(3)对于一个数,总是先读高位,后读低位,而long
型为四个字节的大小,也就是会把a[0]和a[1]全部读出来,而a[1]位于
高地址区,也就先读了。所以取b的值时,取到的就是00380039,省掉前边的0,也就是380039。
同样的问题,干嘛问两遍,呵呵,不过我这次比另一个回答更详细一些
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
乾莘出佩
2020-02-17 · TA获得超过3.1万个赞
知道小有建树答主
回答量:1.2万
采纳率:34%
帮助的人:800万
展开全部
在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体。注:在某些书籍中可能称之为“联合体”,但是“共用体”更能反映该类型在内存的特点。
共用体类型数据的特点
1.同一个内存段可以用来存放几种不同类型的成员,但是在每一瞬间只能存放其中的一种,而不是同时存放几种。换句话说,每一瞬间只有一个成员起作用,其他的成员不起作用,即不是同时都在存在和起作用。
2.共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用。
3.共用体变量的地址和它的各成员的地址都是同一地址。
4.不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。
5.共用体类型可以出现在结构体类型的定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型的定义中,数组也可以作为共用体的成员。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式