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语言初学者关于共用体的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)