c中的嵌套并集

Nested unions in c

本文关键字:嵌套      更新时间:2023-10-16

我不明白为什么下面代码的输出是15,15。联合嵌套在代码中。这个问题是在软件工程师职位的面试中提出的

#include <stdio.h>
#include <malloc.h>
int main()
{
    union A
    {
        long int y[5];
        union B
        {
            double g;
            union C
            {
                int k;
                union D
                {
                    char ch;
                    int x[5];
                }s;
            }a;

        }b;
    }*p;
    p = (union A*) malloc(sizeof(union A));
    p->b.a.k = 15;
    printf("%d ,%d", p->b.a.s.x[0], p->y[0] );

}

此代码打印15,15。请解释一下为什么这是15,15而不是垃圾,垃圾,正如我所期望的?当我使用float k而不是int k时,输出是GARBAGE,GARBAGE为什么会发生这种情况?

如果该联合未嵌套,则成员为:

    long int y[5];
    double g;
    int k;
    char ch;
    int x[5];

在您的平台上,long intint可能都是4个字节,因此y[0]kx[0]都指同一个整数。因此,它们包含相同的值也就不足为奇了。

当你有一个并集时,所有里面的东西都会覆盖在内存中。

因此:

union D
{
    long a;
    int b;
    int c;
}

它们都将在同一个位置开始,所以我在b中输入的任何内容都将显示在c中(反之亦然)。如果我给a赋值,它的前半个比特将显示在b&c.

我想如果我改为这样做:

union D
{
    long a;
    struct ints
    {
        int b;
        int c;
    }
    i;
} NN;

然后,如果我把一些东西放在NN.a中,HOB和LOB将分别显示在int NN.I.a和NN.a.b.中

回到你的例子。

并集A只包含y和b(这是并集b)。在相同的内存中叠加
并集B包含double和并集C…
并集C包含int K和并集D等

现在请注意,开头声明的vars都使用相同的内存。事实上,由于没有像我的例子中那样的灰泥,每个成员都从同一个内存开始。

祝你好运!