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中的联合(联合的内存存储模式) #包括 #包括 联合数据 { 浮动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类型的一个字节。这就是为

在这种情况下,我可以同时访问这两个值 输出为11111.0005,j

但是如果我颠倒赋值,比如data.str='j'
然后是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