如何在C语言中使用Union

我对C语言中的联合有疑问。 在联合中声明的变量将共享相同的内存,好吧,我明白了。 例如,

union student { int i; int j; }x; 

我们怎么能访问i和j? 如果我们有:xi = 1; 然后我们printf("%d",j); 会发生什么? 编译错误? 那么以下情况呢?

 union student { int i; float j; }x; 

如果我们指定xi = 2; xj的价值是多少?

假设你使用

 printf("%d", xj); 

您将看到为xi指定的相同值,因为两个变量都占用相同的内存区域。 像你所做的那样,将两个变量设置为相同类型并不典型。 更典型的是,您可以这样做,以便您可以查看相同的数据,但可以查看不同的数据类型。

想象一下,例如,您希望将doubledouble都视为double ,有时直接访问表示double的位(1和0),您可以使用以下union来实现。

 union DoubleData { double d; char b[8]; } x; 

现在,您可以直接通过d成员分配/访问double,或者通过代表内存中double的8个字节来操作相同的值。

使用您最近的问题更新,

 union student { int i; float j; }x; 

让我们对你的平台做一个假设, int是4个字节, float是4个字节。 在这种情况下,当您访问xj您将操作并将4个字节视为double,当您访问xi您将操作并将4个字节视为整数。

因此,两个变量都覆盖在相同的内存区域中,但不同之处在于您如何解释该内存区域中的位模式。 请记住,任何4字节位模式都是有效的int,但不是任何4字节位模式都是有效的浮点数。

让我们对你的平台做另一个假设,int是2个字节,float是4个字节。 在这种情况下,当您访问xi您将只操作浮点覆盖的位模式的一半,因为在这种情况下xi仅部分覆盖xj因为xj覆盖更多字节。

ij都将共享相同的内存,因此无论你分配给一个内存,其他成员都可以使用。

 xi = 1; // xj = 1 

这是“未定义的行为”。

你可能不会写给i然后从j读。 您一次只能“使用”其中一个元素。