Union不会在C中打印正确的值

时间:2015-05-02 07:40:16

标签: c unions

当我执行此程序时,它不会打印出我输入的内容。

#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的角色。我希望这个程序能打印出我输入的内容。是因为我通过赋值来引用联盟的所有成员 对他们所有人?我应该更改什么,以便它可以使用联合打印输入而不是结构?

1 个答案:

答案 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建立联合元素。