当前位置:首页 » 编程语言 » 共用体初始化c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

共用体初始化c语言

发布时间: 2023-04-13 01:55:08

c语言共用体初始化错误

不知道说的对不对 简单猜测一下
初始化陵源败的时候7000被首先赋予brand成员 但是brand为字符型 所以7000被截断 只取到了最末8位 然后输出时只出现了最后8位的ASCII形式 即X 至裂答于price则是因为格式不符合float形尺颤式直接输出为0了 大胆的猜测一下 如果交换一下两个成员的位置可能price成员能正常输出而brand成员会失败吧...所以这个题目还是用结构体正常一点

② 关于c语言中联合体/共用体中数据存放的问题

你好!!!
首先我们了解联合体的所有成员是在内存中共享一块内存的,在某一时刻只能有一个成员使用这个内存!!!
我们来看看一个例子:
#include <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266
解释如下:
union
{
int i;
char x[2];
}a;
在联合体a中定义了两种数据类型,字符数组x以及整形变量i.其中整形变量是16位的,数组大小为2的字符数组为8X2=16位。如此一来,编译器便会为联合体a在内存中开辟一个16位的空间,这个空间里存储联合体的数据,但是这个空间只有16位,它既是整形变量的数据,也是字符数组的数据。如果你的程序从字符数组的角度解析这个空间,那么它就是两个字符,如果你的程序从整型的角度解析这个空间,那么它就是一个整数。
以你的程序为例子,现在已经开辟了一个16位的空间,然后我们假定现在空间还没有被赋值,为:
00000000 00000000
那么在运行完代码
a.x[0] = 10;
a.x[1] = 1;
之后,16位的空间变为:
00001010 00000001
然后程序运行
printf("%d",a.i);
就是把联合体a当成一个整数来解析,而不是字符串数组。那么这样一来,程序就把这16位变成了一个完整的整数:
(00000001 00001010)二进制 = (266)十进制
注意,你可以看到程序在把16位弄成整数的时候把后面八位放在了前面,前面八位放在了后面。这个反序是计算机存储结构造成的,这个和联合体没有直接关系。如果感兴趣的话可以参考汇编语言。

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

union dt
{
int a;
char b;
double c;
}data;
此时的联合体所占的内存大小是8个字节,接下来执行:
data.a=5;
此此时内存中就不是空的了,也就不会是你说的是随机数,
但是输出:printf("%lf",data.c);结果是0.000000,这个结果我还不能给你准确的解释。但是我可以肯定这与系统把double转换成int 和int 转化成 double 有关!!!

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

③ c语言中的共用体是什么

所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:
union 共用体名
{成员表列};

union data
{
int a ;
float b;
doublec;
chard;
}obj;
该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。

union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*结构体* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
运行程序输出:
15,8
程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。
对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。

可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:
union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
其成员引用为:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。

main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
运行程序输出为:
6
6 7.2
3 4.2,=
程序最后一行的输出是我们无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“ =”。事实上,字符的输出是无法得知的,由写入内存的数据决定。
例子虽然很简单,但却说明了共用体变量的正确用法。

④ 请教!C语言里面的共用体变量定义为什么不能初始化呢

共用体若有多个变量,因为占的是同一内存空间,如闭逗缓果多个变量都初始化的话,后面变量会覆盖前面的变量。所以严格的说,共用体定义时只能对一轿模个成员指核初始化。

⑤ C语言共同体问题

首先这个是共用体,所以各个变量公用轮乎一段内存,你s->i[0]=0x39;s->i[1]=0x38;赋值以后,对应的该段内存最后占8个字节(两个int,根据编译器来戚斗确定)的区域被赋值,char型占一个字节,你输出c[0],也就是第一个字节的数据被输出。而整形数据占的4个字节,在存储时是低位在前的,比如0x11121314.在存储时会被先读取0x14放在第一个字节0x13第二个字节,依次下去,所以0x39相当于在前四个字节的地址高桐磨中存为0x39,0x00,0x00,0x00.这样你读取第一个字节的时候就是0x39了。

⑥ C语言之共用体类型

三、共用体类型
共用体中的所有成员共用同一段内存芹模核(所有成员的起始地址都是一样的)格式:

注:
(1)成员列表为定义该共用体的成员,成员定义与普通变量
的方式一样。
(2)成员列表必须用一对花括号括起。
(3)共用体名可以省略
如:

定义了一个名data的共用体类型,该类型有三个嫌掘成员:i ch s
1、共用体变量的定义
(1)先定义类码培型,再定义变量
(2)定义类型的同时,定义变量
(3)直接定义变量


由于共用体类型变量的所有成员都共用一段内存,所以共用体类型变量所占的字节数等于该共用体类型中占用字节数最多的成员所占的字节数。

2、共用体变量的引用
注:
(1)不能整体引用共用体变量,只能引用其成员。
引用的格式:共用体变量名.成员名
(2)同类型成员共享值
(3)在内存中整型数据的二进制数低8位占用前面一个字节,高8位占用后面一个字节。
如:
整数255,在内存中的存储形式为:
11111111 00000000一个字符型数据占用一个字节,对于数组来说前面元素占用前面的字节。
(4)共用体变量之间可以相互赋值,赋值后两个变量应使用同一成员。
(5)共用体变量的地址与各成员的地址都相同的。
(6)在定义共用体时,可以对其进行初始化,但只能有一个初值且必须用花括号将初值括起。相当于给第一个成员赋值。
(7)共用体、结构体的成员均可以是共用体或结构体类型。
(8)不能用共用体类型变量做为函数参数。
(9)计算共用体占用字节数。

练习题1:

练习题2:

练习题3:

⑦ 怎样初始化共用体类型变量C语言

#include <stdio.h>游没

struct aa
{
int x;
int y;
};

union un
{ int a;
char b;
float c;
} arr ={5};

void main()
{
struct aa xx={1,2};
printf("和银%d %d %d",xx.x,xx.y,arr.a);
}

打神棚纳印出:
1 2 5

⑧ c语言联合体的初始化问题

。。。
局部变量不作初始化是随机值,全局变量会被定义为0;

⑨ 在c语言中,共用体一般有什么作用

共用体一般指联合体,作用如下:

1、节省内存

有两个很长的数据结构,不会同时使用,用结构体的话,只占用最长的那个数据结构所占用的空间,就足够了。

2、做某些转换用

union{char a[8];double x;};

x=20.8;

cout<<hex<<a[0]<<“ ”<<a[1]<<…<<endl;

(9)共用体初始化c语言扩展阅读:

结构体和共用体

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。

共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

共用体也是一种自定义类型,可以通过它来创建变量,