请问C语言高手:关于一个共用体的问题!

请问C语言高手:关于一个共用体的问题!,第1张

1共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。

2当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度(以字节byte为单位,一个byte是8个二进制位)为联合中最长的数据类型长度的整数倍,例如

union foo

{

char s[10];

int i;

};

在这个union中,foo的内存空间的长度为12,是int型的3倍,而并不是数组的长度10。若把int改为double,则foo的内存空间为16,是double型的两倍。

3综上可知,你定义共同体实际在内存中分配的空间是4个byte,因为long数据类型长度是4个byte,而char 字符型数据类型是一个byte,实际在内存中分配的空间示意图

0000 0000(4,最高位)

0000 0000(3)

0000 0000(2)

0000 0000(第一个byte,最低位)

4于是s->i[0]=0x39;,实际占用的是第一个和第二个byte,实际存放方式是:

0 x (2)(16进制,一个字符需要四个2进制位,这个地方有点忘了具体怎么转换的了)

0010 0111(1),

s->i[1]=0x38;占用第三个和第四个个byte,实际存放方式是:

0 x (4),

0010 0110(3),

,于是,最后输出结果是39,因为s->c[0]指向第一个BYTE(字符型char只占一个byte)

5如果对共同体还不是很了解,你可以看一下

你好!!!

首先我们了解联合体的所有成员是在内存中共享一块内存的,在某一时刻只能有一个成员使用这个内存!!!

我们来看看一个例子:

#include <stdioh>

union

{

int i;

char x[2];

}a;

void main()

{

ax[0] = 10;

ax[1] = 1;

printf("%d",ai);

}

答案:266

解释如下:

union

{

int i;

char x[2];

}a;

在联合体a中定义了两种数据类型,字符数组x以及整形变量i其中整形变量是16位的,数组大小为2的字符数组为8X2=16位。如此一来,编译器便会为联合体a在内存中开辟一个16位的空间,这个空间里存储联合体的数据,但是这个空间只有16位,它既是整形变量的数据,也是字符数组的数据。如果你的程序从字符数组的角度解析这个空间,那么它就是两个字符,如果你的程序从整型的角度解析这个空间,那么它就是一个整数。

以你的程序为例子,现在已经开辟了一个16位的空间,然后我们假定现在空间还没有被赋值,为:

00000000 00000000

那么在运行完代码

ax[0] = 10;

ax[1] = 1;

之后,16位的空间变为:

00001010 00000001

然后程序运行

printf("%d",ai);

就是把联合体a当成一个整数来解析,而不是字符串数组。那么这样一来,程序就把这16位变成了一个完整的整数:

(00000001 00001010)二进制 = (266)十进制

注意,你可以看到程序在把16位弄成整数的时候把后面八位放在了前面,前面八位放在了后面。这个反序是计算机存储结构造成的,这个和联合体没有直接关系。如果感兴趣的话可以参考汇编语言。

现在我们来看看,你给的例子:

union dt

{

int a;

char b;

double c;

}data;

此时的联合体所占的内存大小是8个字节,接下来执行:

dataa=5;

此此时内存中就不是空的了,也就不会是你说的是随机数,

但是输出:printf("%lf",datac);结果是0000000,这个结果我还不能给你准确的解释。但是我可以肯定这与系统把double转换成int 和int 转化成 double 有关!!!

暂时我只能解释这那多!!!

在不同的平台上int类型的长度是不同的。 答案是就int类型为2字节,long为4字节而言的。在这种情况下,s共分配4字节,这4字节的内容是0x000x380x000x39,所以以16进制输出b是380039,以字符形式输出第1字节c[0]是9。

而在你的平台上int是4字节,long也是4字节。因此,s共分配8字节,这8字节的内容是0x000x000x000x380x000x000x000x39。所以,以16进制输出b,只输出低4字节39,而以字符形式输出第1字节c[0]依然是9。

以上就是关于请问C语言高手:关于一个共用体的问题!全部的内容,包括:请问C语言高手:关于一个共用体的问题!、C语言中,关于共用体的、C语言初学者关于共用体的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10081184.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存