你能解释印刷工会成员的结果吗?

时间:2013-01-11 19:25:44

标签: c

有谁可以告诉我为什么data.idata.f已损坏?这段代码来自的网站试图解释它,但使用了错误的语法和许多错别字,所以我想知道这里是否有人可以帮助我。

#include <stdio.h>
#include <string.h>

union Data
{
   int i;
   float f;
   char  str[20];
};

int main( )
{
   union Data data;        

   data.i = 10;
   data.f = 220.5;
   strcpy( data.str, "C Programming");

   printf( "data.i : %d\n", data.i);
   printf( "data.f : %f\n", data.f);
   printf( "data.str : %s\n", data.str);

   return 0;
}

编译并执行上述代码时,会产生以下结果:

  

data.i:1917853763
  data.f:4122360580327794860452759994368.000000
  data.str:C编程

4 个答案:

答案 0 :(得分:5)

你误解了union的目的。 union旨在用作可以存储多种类型值的单个变量。但是union仅为最大数据成员的类型分配足够的空间。因此,您一次只能使用一个数据成员。一旦设置了一个成员的值,它就会使其他成员无效。

如果您希望能够存储多个数据成员的值,则需要使用struct

答案 1 :(得分:4)

您有一个union,这意味着一次只能有一名成员上线。当strcpy str memebr时,覆盖f成员的i成员本身会被覆盖。

   data.i = 10;

存储到int成员中,阅读floatchar[20]成员会产生有趣的值,并且可能会出现未定义的行为。

   data.f = 220.5;

存储到float成员中,之前存储的int将丢失。

   strcpy( data.str, "C Programming");

存储到str成员中,先前存储的float将丢失。

data.idata.f打印的值是字符串的一些字节,被解释为int resp。 float

要同时使用多个成员,您需要struct

答案 2 :(得分:0)

这个对象“mystruct”有一个“int”,后跟一个“float”,后跟一个字符串。您可以打印任何或所有项目。

struct mystruct
{
   int i;
   float f;
   char  str[20];
};

这个对象,“myunion”,有一个“int”,一个“float”和一个字符串所有在其他顶层的所有超级。数据一次只对其中一种类型“有效”。

union myunion
{
   int i;
   float f;
   char  str[20];
};

你通常会使用这样的联盟:

#define INT 0
#define FLOAT 1

struct x
{
    int type_tag;
    union
    {
      int x;
      float y;
    }
}

您在运行时为“标记”赋值,以区分“将此数据视为int”(0)或“将其视为浮动”(1)。

'希望有所帮助.. PSM

答案 3 :(得分:0)

实际上,unionstruct不同。

struct的情况下,每个成员在内存中都有自己的位置。

union的情况下,所有成员都放在同一个内存中。因此,你实际上目前只有一个成员,所以你根本无法阅读联盟的所有成员。