如何在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
指定的相同值,因为两个变量都占用相同的内存区域。 像你所做的那样,将两个变量设置为相同类型并不典型。 更典型的是,您可以这样做,以便您可以查看相同的数据,但可以查看不同的数据类型。
想象一下,例如,您希望将double
和double
都视为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
覆盖更多字节。
i
和j
都将共享相同的内存,因此无论你分配给一个内存,其他成员都可以使用。
xi = 1; // xj = 1
这是“未定义的行为”。
你可能不会写给i
然后从j
读。 您一次只能“使用”其中一个元素。