c中的联合(联合的内存存储模式) #包括 #包括 联合数据 { 浮动f; char-str; }; 主要() { 联合数据; 数据f=11111; data.str='j'; printf(“data.f:%f\n”,data.f); printf(“data.str:%c\n”,data.str); 返回0; }
在这种情况下,我可以同时访问这两个值 输出为11111.0005,j 但是如果我颠倒赋值,比如data.str='j'c中的联合(联合的内存存储模式) #包括 #包括 联合数据 { 浮动f; char-str; }; 主要() { 联合数据; 数据f=11111; data.str='j'; printf(“data.f:%f\n”,data.f); printf(“data.str:%c\n”,data.str); 返回0; },c,C,在这种情况下,我可以同时访问这两个值 输出为11111.0005,j 但是如果我颠倒赋值,比如data.str='j' 然后是data.f=11111 那么str的值是不可访问的,为什么? union将float类型和char类型覆盖在同一内存中。但是char类型只有一个字节,而float需要4个字节 虽然在32位平台上,简单的char类型可能需要与简单的float类型一样多的内存,但在union中,仅写入char字段的一个字节 因此,当您写入它时,它只会损坏float类型的一个字节。这就是为
然后是data.f=11111
那么str的值是不可访问的,为什么? union将
float
类型和char
类型覆盖在同一内存中。但是char
类型只有一个字节,而float
需要4个字节
虽然在32位平台上,简单的char
类型可能需要与简单的float
类型一样多的内存,但在union
中,仅写入char
字段的一个字节
因此,当您写入它时,它只会损坏float
类型的一个字节。这就是为什么您仍然可以printf()
字符char
,以及float
查看方式已损坏的原因
我在联合
中添加了另一个成员,这是一个字节数组,因此我们可以看到发生了什么。请注意,将'j'
(十六进制值0x6A)写入str
只会影响联合的第一个字节
#include<stdio.h>
#include<string.h>
union Data
{
float f;
char str;
};
main( )
{
union Data data;
data.f = 11111;
data.str='j';
printf( "data.f : %f\n", data.f);
printf( "data.str : %c\n", data.str);
return 0;
}
如果像你的问题一样,你颠倒了作业,那么现在是否清楚为什么str='j'
不再存在?这是因为浮点
需要所有联合
嗯…一个联合
不是一个结构
…成员共享相同的内存。如果指定一个,则至少部分地覆盖另一个。我得到数据。f:11111.103516
,这是可以解释的。您的11111.0005
值没有任何逻辑解释,只是代码显示未定义的行为。您期望的行为是什么?如果这两个值在内存中重叠,这似乎正是您所期望的。
#include<stdio.h>
#include<string.h>
union Data
{
float f;
char str;
};
main( )
{
union Data data;
data.f = 11111;
data.str='j';
printf( "data.f : %f\n", data.f);
printf( "data.str : %c\n", data.str);
return 0;
}
bytes: 00 9C 2D 46
bytes: 6A 9C 2D 46
data.f : 11111.103516
data.str : j