您当前的位置:首页 > 互联网教程

c语言共用体赋值问题

发布时间:2025-05-11 23:53:29    发布人:远客网络

c语言共用体赋值问题

一、c语言共用体赋值问题

1、有没有分无所谓,本人很乐意回答你的疑惑。

2、共同体,顾名思义,里面的成员共享一块内存空间。

3、你这里面x没有写出来,估计是定义成一个整数。在32位系统下,整数占用32位内存,也就是4个字节。由于结构体里面只有两个char,所以占用两个字节的内存。共享了整数的前两个字节的内存空间。整个结构体所占用的内存就是两个成员最多的4个字节。

4、当我们执行a.x=0x1234的时候,这4个字节大小的空间便被这个整数填满。由于Intel X86处理器的字序原因(小尾,Little end),内存从低地址到高地址是这样被填满的。

5、由于b.c1使用该共同体的第一个字节,所以b.c1的值为0x34,b.c2也就是0x12了,假如你的结构体有c3,c4,那么c3,c4就是00了。

6、这个结果和CPU的字序息息相关,有一些处理器字序是“大尾(Big end)",比如sparc,0x1234在内存中的排列是

7、这样,得出的结果就是c1= 00, c2= 00, c3= 0x12, c4= 0x34。

二、C语言中共用体的问题

double类型占8个字节,int类型占4个字节,un_1共用体占8个字节,i成员占用它的前四个字节

执行s1.x=123.4;之后,s1位置内存中存放的值为:

40 5E D9 99 99 99 99 9A(十六进制,左边是高位,右边是低位,你可以查查浮点数是如何表示的,double的前12个二进制位表示阶数,后面的表示尾数)

其中i占用前四个字节(低位的四个字节)即99 99 99 9A这部分

执行s1.i=100;之后,i的位置被修改为100即十六进制的64,s1位置内存变为:

这是再把它看做一个double的格式输出就是123.399963

改成s1.x=123.4;printf("%d\n",s1.x);

由于要求输出一个int,所以printf函数只读取了s1.x的前四个(低位的四个)字节

s1位置的内存为:40 5E D9 99 99 99 99 9A

输出的是99 99 99 9A,按照int类型输出为-1717986918(符号位为1,所以是负的)

同理,改成s1.i=100;printf("%f\n",s1.i);

执行s1.i=100;之后,s1位置的内存为

三、c语言中的共用体是什么

所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:\x0d\x0aunion共用体名\x0d\x0a{成员表列};\x0d\x0a\x0d\x0aunion data\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adoublec;\x0d\x0achard;\x0d\x0a}obj;\x0d\x0a该形式定义了一个共用体数据类型union data,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。\x0d\x0a\x0d\x0aunion data/*共用体*/\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a}mm;\x0d\x0astruct stud/*结构体*/\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a};\x0d\x0amain()\x0d\x0a{\x0d\x0astruct stud student;\x0d\x0aprintf("%d,%d",sizeof(struct stud),sizeof(union data));\x0d\x0a}\x0d\x0a运行程序输出:\x0d\x0a15,8\x0d\x0a程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。 \x0d\x0a对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。\x0d\x0a\x0d\x0a可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:\x0d\x0aunion data/*共用体*/\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a}mm;\x0d\x0a其成员引用为:mm.a,mm.b,mm.c,mm.d但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。\x0d\x0a\x0d\x0amain()\x0d\x0a{\x0d\x0aunion data\x0d\x0a{\x0d\x0aint a;\x0d\x0afloat b;\x0d\x0adouble c;\x0d\x0achar d;\x0d\x0a}mm;\x0d\x0amm.a=6;\x0d\x0aprintf("%d\n",mm.a);\x0d\x0amm.c=67.2;\x0d\x0aprintf("%5.1lf\n", mm.c);\x0d\x0amm.d='W';\x0d\x0amm.b=34.2;\x0d\x0aprintf("%5.1f,%c\n",mm.b,mm.d);\x0d\x0a}\x0d\x0a运行程序输出为:\x0d\x0a6\x0d\x0a6 7.2\x0d\x0a3 4.2,=\x0d\x0a程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“=”。事实上,字符的输出是无法得知的,由写入内存的数据决定。\x0d\x0a例子虽然很简单,但却说明了共用体变量的正确用法。



相关内容FAQs: