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

c语言联合体存储

发布时间: 2022-06-22 14:51:37

c语言联合体内存计算

你的意图我不是很明白,就说说我知道的地方吧,
联合体就是你声明的所有变量他们的起始地址是相同的。换句话说他们公用一块地址。所以整个联合体的大小取决于内部变量占用空间最大的。
看看你联合体内的成员
a占4字节
b[9]
占9个字节
c占8个字节,所以按照最大的计算,联合体啊占大小9个字节,但是他还要满足第二个条件,就是大小必须是内部成员基础类型的整数倍。你的基础类型是int
4字节
char
1字节
double
8字节
取公因数并且要比9大所以他的大小事16个字节。
第二个问题,你直接为一个该结构体的指针赋值(这种做法很危险,因为你不知道指向的空间具体是什么内容),所以
pp
就指向了一个空间,然后
qq=pp+0x10
这里你要注意,并不是简单地pp的地址值上加上0x10编译器对这里的理解是
现在眼前有很多的该结构体类型,他们紧密排列,如果pp的编号是1
那么qq的编号是1+0x10
所以说qq的实际指向地址

0x100000(pp的地址)+sizeof(dt)(每个结构体的大小)*0x10
注意结构体大小是16
是十进制
转换成16进制也就是0x10
结果正好是0x100100了
所以最后的输出就是输出他们指向的地址值。

❷ C语言联合体存储方法

这个和体系结构有关。首先int行具体是1个字节还是2个字节是不确定的。早期的编译器来说。int是一字节。但是现在的都是2字节。因为计算机处理器一般都是32位处理器。
联合只取最大的空间。比如。你定义的联合体。int
A,char
B[2],其实在计算机里面只占用了2个字节。你存储char时,全占了。当你存储为int类型时候。要么占用一半的空间。要么全部都占用了。这个和计算机体系结构有关。但是a和b是不会同时存在的。联合中的成员同时只能有一个。这个是和结构体区别的地方。如果还有疑问建议你去看看书吧。这个是基础知识。

❸ C语言中不同联合体变量是否共用一个存储单元

unionA{.......}内的成员,公用一个存储单元.

unionAa;占一个存储单元

unionAb;占一个存储单元

共占两个存储单元.


至于union嵌套,依然遵循以上原则.联合体内成员公用一个存储单元.

unionAAA{
inta;
unionBBB{
double_a;
char_b;
}b;
}c;

BBB中包含_a 和 _b ,公用一个存储单元, b占内存大小为double大小

AAA中包含a 和 b , 公用一个存储单元 , c占用内存大小为b的大小.

❹ C语言中关于联合体的数据存放问题

联合体内,成员变量共享内存。

现在联合体内,有2个成员,一个是 y ( 需要4字节存放),另一个是结构体x,
x 正好需要 4 字节存放。所以这个联合体大小只 需要 4 字节内存 就够了。
(1个字节描述1个8位2进制数, 1 byte = 8 bits, 字节,是计算机内存 基本单位。)

主程序给 y 赋值 0x11223344 (16进制),正好放满4字节,4个字节内容 是 11,22,33,44。

结构体x 共享这4个字节里的内存。x.low 用了前2个字节, x.high 用了后2个字节,所以 x.low=0x1122,
x.high = 0x3344.

于是 num.x.low+num.x.high = 0x1122 + 0x3344 = 0x4466.

❺ 关于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语言中的联合又什么

楼主强,会员都出来了,难道其英文叫做vip?

呵呵

union myunion //联合体名
{
//添加联合体变量
};

❼ c语言:判断联合体中存储的数据的类型

structexample
{
enum{
chaos,//没有初始化,错误的状态
int_t,//存的是int
chars_t,//存的是char
}type;
union{
inta;
charb[50];
};
}flag[10];

每次修改的时候手动设置type的值,没有别的办法

❽ 有关C语言联合体

#include<stdio.h>
union un
{
int i;
char c[2];
};

void main( )
{
union un x;

x.i=0;
x.c[0]=10;
x.c[1]=1;
printf("%d\n",x.i);
}

运行结果:266

266的16进制是:0x010A
x.c[0]=10; 的16进制是0x0A
x.c[1]=1;的16进制是0x01

楼主,应该看出来它们的关系了吧?
__________________
|__x.c[0]__|__x.c[1]__|

如上图,按char排放
当按int排放的时候,
x.c[1]是低字节,x.c[0]是高字节