c - 使用 union 变量分配两个值

标签 c unions

变量 a 被赋值为 10,变量 b 被赋值为 20, union 变量 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 作为输出。

最佳答案

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

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

在非常扭曲的场景中,可以将不同值的部分同时存储在一个 union 中,但通常部分覆盖的值将被假定为已损坏。例如,这个:

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 不再值得信赖。

通常用于存储不同类型的 union 会嵌入到一个结构中,该结构的第一个成员记录正在使用哪个 union 成员:

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

这里,type 可能包含一个枚举值,以指示 datum.chdatum.n 是否在原子中使用。

关于c - 使用 union 变量分配两个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18306249/

相关文章:

c - 文本文件转十六进制

c - 如何使用调用堆栈传递函数指针?

c - 为什么此代码片段的输出有所不同?

c - 数据在一个内存块中的 ANSI C 哈希表实现

连接()错误: operation not permitted

c++ - 使用只有一名成员的 union 的目的是什么?

c++ - 标记为 bitset 和 uint64_t 的并集

c - 与具有灵活数组成员的匿名结构 union

c++ - c 中的嵌套 union

c - 在标记的联盟上 dispatch