如何在C语言中使用Union

时间:2011-04-30 14:40:14

标签: c unions

我对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的价值是什么?

3 个答案:

答案 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)

ij都将共享相同的内存,因此您分配给其中一个内容的其他成员也可以使用。

x.i  = 1;
// x.j = 1

答案 2 :(得分:1)

这是“未定义的行为”。

您不能写信至i,然后阅读j。您一次只能“使用”其中一个元素。