有谁可以告诉我为什么data.i
和data.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编程
答案 0 :(得分:5)
你误解了union
的目的。 union
旨在用作可以存储多种类型值的单个变量。但是union
仅为最大数据成员的类型分配足够的空间。因此,您一次只能使用一个数据成员。一旦设置了一个成员的值,它就会使其他成员无效。
如果您希望能够存储多个数据成员的值,则需要使用struct
答案 1 :(得分:4)
您有一个union
,这意味着一次只能有一名成员上线。当strcpy
str
memebr时,覆盖f
成员的i
成员本身会被覆盖。
data.i = 10;
存储到int
成员中,阅读float
或char[20]
成员会产生有趣的值,并且可能会出现未定义的行为。
data.f = 220.5;
存储到float
成员中,之前存储的int
将丢失。
strcpy( data.str, "C Programming");
存储到str
成员中,先前存储的float
将丢失。
为data.i
和data.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)
实际上,union
与struct
不同。
在struct
的情况下,每个成员在内存中都有自己的位置。
在union
的情况下,所有成员都放在同一个内存中。因此,你实际上目前只有一个成员,所以你根本无法阅读联盟的所有成员。