C++ c语言中的嵌套联合
我不明白为什么下面代码的输出是15,15。联合嵌套在代码中。这个问题是在面试软件工程师职位时提出的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 {
#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;