当我执行此程序时,它不会打印出我输入的内容。
#include <stdio.h>
#include <conio.h>
union integer{
char c;
short s;
int i;
long b;
};
int main( void )
{
union integer aInteger;
printf( "Enter a char: " );
scanf( "%c", &aInteger.c );
printf( "\nEnter a short: " );
scanf( "%hd", &aInteger.s );
printf( "\nEnter a int: " );
scanf( "%d", &aInteger.i );
printf( "\nEnter a long: " );
scanf( "%ld", &aInteger.b );
printf( "\nChar: %c\nShort: %hd\nInt: %d\nLong: %ld",
aInteger.c, aInteger.s, aInteger.i, aInteger.b );
getche();
return 0;
}
我输入A,12,1234和123456789作为输入,结果是一个从口袋妖怪,-13035,123456789和123456789看起来像未知的形状Z的角色。我希望这个程序能打印出我输入的内容。是因为我通过赋值来引用联盟的所有成员 对他们所有人?我应该更改什么,以便它可以使用联合打印输入而不是结构?
答案 0 :(得分:2)
来自&#34; C编程语言&#34;作者:Kernighan和Ritchie:
6.8 UNIONS
union 是一个变量,可以保存(在不同的时间)不同类型和大小的对象,编译器可以跟踪大小和对齐要求。
关键词是&#34;在不同的时间&#34;。对其中一个元素的每个写操作也会改变其他成员的值,因为元素本身在内存中重叠。
在打印输出时,将丢弃最后一次写入操作的所有结果。 (不是根据定义;您的上一次写入操作仅写入了最大量的数据。较短数据量是否会覆盖其他元素的全部或部分,取决于{的大小编译器的{1}}和char
。)
如果您认为必须使用short
而不是union
,则必须确保无法覆盖&#34; old&#34;带有&#34; new&#34;的数据。这需要您了解基本类型的大小,并且必须使每个元素成为具有最大元素总长度的数组 - 和为vlaue保留足够的空间最大的元素:
struct
这假设所有较大的尺寸都是较小尺寸的倍数,即,当(可以想象)union integer {
char c[2*sizeof(long)/sizeof(char)];
short s[2*sizeof(long)/sizeof(short)];
int i[2*sizeof(int)/sizeof(long)];
long b[2];
};
为3但sizeof(short)
为4时,它将不起作用。
现在,您可以阅读并写信给sizeof(int)
,aInteger.c[0]
,aInteger.s[1]
和aInteger.i[2]
,而不会覆盖任何其他内容&#39; &#34;重要&#34;数据
我可能在这里有一些错误。再说一次,我不想测试这个,因为这是一个纯粹的学术问题,实际上你应该只使用常规的aInteger.b[1]
,或者从struct
建立联合元素。