我对C语言中的联合有疑问。 在联合中声明的变量将共享相同的内存,好吧,我理解。 例如,
union student {
int i;
int j;
}x;
我们怎么能访问i和j?
如果我们有:x.i = 1;
然后我们printf("%d",j);
会发生什么?编译错误?
那么下面的情况呢?
union student {
int i;
float j;
}x;
如果我们指定x.i = 2; x.j的价值是什么?
答案 0 :(得分:12)
假设您使用
printf("%d", x.j);
您将看到分配给x.i
的相同值,因为两个变量占用相同的内存区域。像你所做的那样,将两个变量放在同一类型中并不典型。更典型的是,您可以这样做,以便您可以查看相同的数据,但可以查看不同的数据类型。
想象一下,例如,您希望将double
两者都视为double
并且有时直接访问代表双精度的位(1和0),您可以使用以下联合执行此操作
union DoubleData
{
double d;
char b[8];
} x;
现在您可以直接通过d
成员分配/访问double,或者通过代表内存中double的8个字节来操作相同的值。
使用您对问题的最新更新
union student
{
int i;
float j;
}x;
让我们对您的平台做出假设,int
为4个字节,float
为4个字节。在这种情况下,当您访问x.j
时,您将操作并将4个字节视为双精度,当您访问x.i
时,您将操纵并将4个字节视为整数。
因此两个变量都覆盖在相同的内存区域中,但不同之处在于您如何解释该内存区域中的位模式。请记住,任何4字节位模式都是有效的int,但不是任何4字节位模式都是有效的浮点数。
让我们对你的平台做另一个假设,int是2个字节,float是4个字节。在这种情况下,当您访问x.i
时,您只会操纵由浮点覆盖的位模式的一半,因为在这种情况下x.i
只会部分覆盖x.j
,因为{{1}覆盖更多字节。
答案 1 :(得分:1)
i
和j
都将共享相同的内存,因此您分配给其中一个内容的其他成员也可以使用。
x.i = 1;
// x.j = 1
答案 2 :(得分:1)
这是“未定义的行为”。
您不能写信至i
,然后阅读j
。您一次只能“使用”其中一个元素。