C++ c语言中的嵌套联合

C++ c语言中的嵌套联合,c++,c,nested,unions,C++,C,Nested,Unions,我不明白为什么下面代码的输出是15,15。联合嵌套在代码中。这个问题是在面试软件工程师职位时提出的 #include <stdio.h> #include <malloc.h> int main() { union A { long int y[5]; union B { double g; union C {

我不明白为什么下面代码的输出是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] );


}
#包括
#包括
int main()
{
联盟A
{
长整数y[5];
工会B
{
双g;
工会C
{
int k;
工会D
{
char ch;
int x[5];
}s;
}a;
}b;
}*p;
p=(联合体A*)马洛克(联合体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时,输出是垃圾,垃圾为什么会发生这种情况?

如果这个联合是非嵌套的,那么成员将是:

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

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

当您拥有一个并集时,内存中的所有内容都将覆盖在内存中

因此:

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

我想如果我这样做的话:

union D
{
    long a;
    struct ints
    {
        int b;
        int c;
    }
    i;
} NN;
然后,如果我在NN.a中放入一些内容,HOB和LOB将分别出现在ints NN.I.a和NN.a.b中

回到你的例子

联合体A仅包含y和b(即联合体b)。在相同的内存覆盖中。
接头B包含双联接头和接头C.。
联合体C包含整数K和联合体D等

现在请注意,开头声明的变量都使用相同的内存。事实上,因为在我的示例中没有stucts,所以每个成员都从相同的内存开始


祝你好运

我甚至不想知道你想要完成什么。他说这是一个面试问题,这意味着它是故意混淆和混淆的。提示:联合不是结构。你为什么认为它是垃圾&y[0]=&b.a.s.x[0]=&b.a.k.它们都是该类型的第一个元素。此代码高度依赖于平台,可以在64位计算机上输出垃圾(
sizeof(long int)!=sizeof(int)
)或者在大端机上。如果
long int
int
的大小相同,并且有一个小端机架构,那么这就无关紧要了。或者对于
long
int
之间的直接赋值,端号是正确的+1无论如何。如果在我的代码中它是“float a”而不是“int k”,那么代码的输出将是垃圾,为什么在float的情况下会是垃圾?因为所有的值都占用相同的内存空间,但是该地址的值如何解释取决于您通过哪个联合成员访问。当您将浮点存储在该位置,然后使用int成员检索它时,您将看到浮点值的底层表示形式。这类似于做
float x=42;int*xp=(int*)&x;printf(“宇宙中的生命和一切都不是的答案:%d\n”,*xp)@kfsone在下面的代码中可以看到FastAI的代码如果我将长a替换为浮点a,然后分配b=10,然后打印a的值,它打印0.00为什么???如果它是浮点a而不是长a(在代码中),那么它将不包含初始化b或c的值,为什么会这样?@user2481909-我假设在这个例子中,long的大小是int的两倍。浮点可能比long占用更多字节。有一种在内存中存储浮点数的方法(IEEE,二进制尾数+指数,对谷歌来说是一个词)。试着找一个教程,向你展示UNION在内存中的布局,它将帮助你回答你仍然存在的问题。我尝试了“C union struct memory”,得到了很多漂亮的图片,没有“SQL union”噪音(一点google fu建议!)
union D
{
    long a;
    struct ints
    {
        int b;
        int c;
    }
    i;
} NN;