【问题标题】:union initializing in c [duplicate]在c中初始化联合[重复]
【发布时间】:2014-03-23 03:22:29
【问题描述】:
#include<stdio.h>
int main()
{
    union emp;
    union emp{
    int age;
    char name[2];
    };
    union emp e1={512};
    printf("%d,%d,%d",e1.age,e1.name[0],e1.name[1]);
    return 0;
}

我在这里尝试创建一个联合并初始化它的第一个成员,即“int age”。据我所知,ANSI C 编译器支持这一点。我的问题是为什么我得到像“512,0,2”这样的输出。如果我用 513、514 和 768 替换 512,我会得到以下输出。 "513,1,2", "514,2,2", "768,0,3", 现在我可以看到 e1.name[0] 正在存储(数字)%256,而 e1.name[1] 正在存储(数字)/256。 如果解释为什么以及如何发生这种情况,将不胜感激。 谢谢大家。

【问题讨论】:

标签: c arrays unions


【解决方案1】:

这是未定义的行为,您不能将字段存储在联合中并将其作为另一种类型检索。因此,您不能真正“期望”这段代码有任何输出,因为就标准而言,任何东西都是可以接受的。

看到这个问题:A question about union in C

除此之外,由于 512 是 2^9,假设整数是 32 位,字符是 8 位,这仅仅意味着你的架构是小端的,因为 512 是 0x200。当您访问e1.name[0] 和e2.name[1] 时,您正在访问存储在内存中的512 的前2 个字节,显然恰好是0x00(最低有效字节)和0x2(最低有效字节之后的下一个字节)。

【讨论】:

    【解决方案2】:

    这是工会应该做的。它以不同的数据类型存储相同的数据。为了你的价值观

    513 = 0x0201
    514 = 0x0202
    768 = 0x0300
    

    name[0] 存储最低有效字节,name[1] 存储最高有效字节。如果您使用不同的架构,它会被颠倒过来。

    【讨论】:

    • 感谢您解释我的问题。你的回答很简短,但很清楚。现在我明白了。
    【解决方案3】:

    想象一下:一个联合可以容纳两个字符或一个整数。如果将一个 int 存储到 union 中,也可以读取两个 char 部分,但它们将包含存储的 int 的二进制部分。 因此,在您的示例中,name[0] 将包含原始存储的 int 的低 16 位,name[1] 将包含原始 int 的高 16 位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2021-10-23
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      相关资源
      最近更新 更多