【问题标题】:Assigning two values with an union variable使用联合变量分配两个值
【发布时间】:2013-08-19 04:07:22
【问题描述】:

变量 a 由值 10 分配,变量 b 由 20 与联合变量 v 分配。然后它给出 a 的输出是 20 而不是 10。我不明白。

#include<stdio.h>  
int main()  
{
   union var
   {
       int a, b;
   };
   union var v;
   v.a=10;
   v.b=20;
   printf("%d\n", v.a);
   return 0;
}  

我执行了程序,得到了 20 作为输出。

【问题讨论】:

  • 不确定你在问什么;但是Google 有很多关于 C 联合的信息
  • 谢谢@JensGustedt。我已经删除了误导性评论(你应该只阅读最近写的字段)

标签: c unions


【解决方案1】:

union 将所有列出的成员重叠在一起(尽管有些成员可能会比重叠的初始部分延伸得更远),因此分配给.a.b 是在内存的同一部分上写入。考虑到这一点,输出应该是有意义的。

如果您期望输出为 10,您可能正在考虑 struct 的行为。

在真正扭曲的情况下,可能会将不同值的部分同时存储在联合中,但通常会假定部分覆盖的值已损坏。例如,这个:

union {
    char a;
    struct { char ba; char bb; } b;
} s;

可以同时存储s.as.b.bb,但由于s.as.b.ba 重叠,分配给s.a 会影响s.b.ba,并暗示所有s.b 不再可信.

通常用于存储不同类型的联合将嵌入到结构中,其第一个成员记录正在使用的联合成员:

struct {
    int type;
    union {
       char ch;
       int n;
    } datum;
} atom;

这里,type 可能包含一个枚举值,以指示原子中使用的是 datum.ch 还是 datum.n

【讨论】:

    【解决方案2】:

    在一次联合中,您可以分配一个值。在联合中,这些值相互重叠。所以你在为联合的两个元素赋值时做错了。它将始终显示最后分配的值。因此,如果您正在访问 a 的值,它将显示最后更新的值。

    【讨论】:

      【解决方案3】:

      这是一个有启发性的问题。尝试颠倒分配,如:

         v.b=20;
         v.a=10;
      

      然后看看结果。如果您希望 ab 共存而不是相互重叠,请使用结构,如:

      #include<stdio.h>  
      int main()  
      {
         struct var
         {
             int a, b;
         };
         struct var v;
         v.a=10;
         v.b=20;
         printf("%d\n", v.a);
         return 0;
      }  
      

      你应该得到想要的结果。但是,var 结构现在包含两个整数。

      【讨论】:

        【解决方案4】:

        unionstruct 在以下两个方面有所不同:

        • 为存在的最大类型分配空间(因为它们都是int,联合体的整体大小为int
        • Only one value 可以随时存储在union 中。

        您存储到v 中的最后一个值是20,因此在打印union 的任何成员时应该期望返回该值。

        如果您想同时访问这两个成员,那么您应该使用struct

        【讨论】:

        • 如果我想要 a=10 和 b=20 的值,那么我可以使用 union..??我如何使用联合来获取这些值,是否可能或我应该使用结构..??
        • 否。如果你想要这种行为,请使用 struct
        • @Vaibhav 当您不知道联合是什么或它的用途时,为什么要尝试使用它?为什么你使用结构?
        • @JimBalter:在某些情况下...有些情况会被认为是“未定义”或“肮脏、邪恶的黑客”...union 可以派上用场。然而,在这个的特殊情况下,我完全同意你的看法。
        • 您的回复与我写的无关;我没有说联合不方便......它不需要任何未定义或肮脏的东西。
        【解决方案5】:

        你应该阅读union

        这将帮助您了解发生了什么 - 基本上 union 的所有成员都存储在内存中的相同地址。

        【讨论】:

          【解决方案6】:

          让我们假设,原始 int 大小是 32 位。

          C/C++中联合数据类型的概念是:它使我们能够在同一个内存位置存储不同的数据类型。我们可以定义一个包含许多成员的联合,但在任何给定时间只有一个成员可以包含一个值。联合体的大小足以容纳其最大的成员。

          在您的情况下:“a”和“b”都是 int 类型,因此“var”联合的大小是 32 位。

          现在想象一个大小为 32 的二进制数组。让我们说它A [32]。最低 5 个有效位存储 01010,即分配给“v.a”的 10 的二进制形式。接下来,当您将 20 分配给“v.b”时,10100(20 的二进制形式)将替换 01010。所以目前联合 v 在其内存空间中有 10100。

          当您访问“v.a”时,它会返回该内存位置的当前值。

          查看链接wikipedia link

          【讨论】:

            猜你喜欢
            • 2013-04-28
            • 2021-07-30
            • 2016-08-17
            • 1970-01-01
            • 2011-08-08
            • 1970-01-01
            • 2018-06-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多