❶ c语言中共用体变量所占内存长度等于
C语言中共用体变量所占内存长度等于其中长度最长的那个成员的长度
❷ C语言共同体问题
结果应该是输出一个随机数!有这样几个概念关于共用体,也就是你说的共同体:1、共用体是几种不同的变量存放在同一内存当中,即在内存中占同一位置2、同一内存段可以用来存放几种不同类型的成员,但是在每一瞬只能放其中的一种,而不是同时存放几种类型。也就是每一瞬只有一个成员起作用!3、共用体变量中起作用的成员是最后一次存放的成员。根据以上原则来看你这道题:#include "stdio.h"union un{int i;char c[2];} //共用体变量定义完成后应当以分号结束,此处应该加一个分号main(){union un x; //定义共用体变量xx.c[0]=10; //字符数组第一个字符位置存放整型10,字符变量和整型变量可以相互转换x.c[1]=1; //字符数组第二个字符位置存放整型1//至此,共用体变量x.c成员被赋值,其中x.c[0]==10,x.c[1]==1,而x.i不起作用printf("\n%d",x.i); //因为x.i没有被赋值,所以它的值由内存自动分配,所以会产生随机数}
❸ C语言细节:共用体的字节长度问题
union 里的成员 共享 内存。
哪个成员 长度最长,内存大小就 用它决定。
另外,编译器考虑“内存对齐”,32位机上考虑 按32 位对齐,也就是 4 字节 对齐。
需要的最大长度不为4 的整数 倍数 时,给它分配 多1个或2个或3个字节,凑成4 的整数 倍数。
int a; 需内存大小 sizeof(int)
char b[x]; 需内存大小 x * sizeof(char).
M1 = sizeof(int);
M2 = x * sizeof(char).
if (M2 > M1) M = M2; else M = M1;
if (M%4 != 0) M = (M / 4 + 1) * 4;
例如:
x=6; M1=sizeof(int)=4; M2= 6 * sizeof(char) = 6;
M=M2=6;
M%4 = 6%4 = 2; 符合 if (M%4 != 0) M = (M / 4 + 1) * 4 = (6/4+1) * 4 = 8.
结果 8。
例如:
x=7; M1=sizeof(int)=4; M2= 7 * sizeof(char) = 7;
M=M2=7;
M%4 = 7%4 = 3; 符合 if (M%4 != 0) M = (M / 4 + 1) * 4 = (7/4+1) * 4 = 8.
结果 8。
===========
sizeof(test)=4n // 必须 4 字节 对齐, 所以必定是4的整倍数
4(n-1)<=x<=4n // x 的个数,当然 小于等于 总字节数4n, 大于等于 4n-4 个字节数。
❹ C语言中联合体是什么样的与结构体不一样吧还有运算符的目数怎么计算
共用体
构造数据类型,也叫联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)
结构体是一种构造数据类型
用途:把不同类型的数据组合成一个整体-------自定义数据类型
---------------------------------------------------------------
结构体变量所占内存长度是各成员占的内存长度的总和。
共同体变量所占内存长度是各最长的成员占的内存长度。
共同体每次只能存放哪个的一种!!
共同体变量中起作用的成员是尊后一次存放的成员,
在存入新的成员后原有的成员失去了作用!
---------------------------------------------------------------
Structure 与 Union主要有以下区别:
1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union变量的长度等于最长的成员的长度。
2. 对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的。
举一个例子:
例:
#include <stdio.h>
void main()
{
union{ /*定义一个联合*/
int i;
struct{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*联合成员赋值*/
printf("%c%c\n", number.half.first, number.half.second);
number.half.first='a'; /*联合中结构成员赋值*/
number.half.second='b';
printf("%x\n", number.i);
}
输出结果为:
AB
6261
❺ c语言,关于共同体的问题
1。局部变量是不会初始化为0的;
2。共同体的意思是里面的元素(或说字段)它们公用同一内存,一个更改了,另外的也会被更改;当你输入X的时候,由于输入的是很小的数,在低字节里,其他的(除了符号位)为0,float低字节为指数位,他的数据位在高字节中,是0,所以y是0;反过来输入Y,int x就会变成一个很大的数,因为高字节有数据。
❻ 关于c语言共用体的问题
int型的变量占2个字节,而一个内存单元只有一个字节的大小,因此int型变量要分开放。
那怎么放呢?是这样的,先把int变量分成两个字节,前八位作为高字节,后八位作为低字节,这样,把高字节的那八位放在低地址内存单元,低字节的那八位放在高地址内存单元。
而long型的占四个字节,也是一样的,分成四个字节分开放,高字节放低地址内存单元。
你的程序中,只占一个字节的0x39给了int型的i[0],那这样,高字节为0,假设放在最低地址的内存单元中,那0x39就顺着往上放,i[1]也一样。好了,这样放完后,这个占四个字节的共用体变量的存储情况就是:0x38/0x00/0x39/0x00(说明:左手边为高地址,右手边为低地址)。
i[1]i[0]
好了,我们现在是取long型的k,那很显然,低地址的存储单元是它的高字节,高地址的存储单元是它的低字节,这样就得到:0x00390038。
这是我用keil-C51仿真得到的结果,如果你问为什么结果跟你的不一样,那我只能回答:系统决定变量的存放方式。
❼ C语言的结构体和共同体的区别是什么
结构体(structure)是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型,而且每个成员的数据类型可以相同也可以不相同。共同体(union)将几种不同的变量储存在同一内存单元中,也就是使用覆盖技术,几个变量互相覆盖,这种几个不同的变量共同占用一段内存的结构,可见二者最大的区别就是所占用的内存,结构体(structure)所占用的内存是分量内存之和,共同体(union)所占用的内存是等于最大的分量的内存。
具体来说,结构体(structure)与共同体(union)主要有以下区别:
1.结构体(structure)与共同体(union)都是由多个不同的数据类型成员组成,
但在任何同一时刻,
共同体(union)中只存放了一个被选中的成员,
而结构体(structure)的所有成员都存在。在结构体(structure)中,各成员都占有自己的内存空间,它们是同时存在的。一个结构体(structure)变量的总长度等于所有成员长度之和。在共同体(union)中,所有成员不能同时占用它的内存空间,它们不能同时存在。共同体(union)变量的长度等于最长的成员的长度。
2.
对于共同体(union)的不同成员赋值,
将会对其它成员重写,
原来成员的值就不存在了,
而对于结构体(structure)的不同成员赋值是互不影响的。
❽ 请问C语言高手:关于一个共用体的问题!
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.如果对共同体还不是很了解,你可以看一下
❾ C语言共用体
int和char占用的字节数跟编译器有关,可以用sizeof()查看。
这里假设int占4个字节,char占1个字节,共用体变量a的内存分布如下图所示:
因此,如果之前未对i赋值,那打印i的值实际上就是打印二进制(xxxxxxxxch[1]ch[0])数对应的十进制数。xxxx表示该字节的数是不确定的。当xxxx是0的时候,则i=(0000000C),对应的十进制数就是13。