-1

在下面的程序中,我可以理解为什么short联合的成员存储在相同的 2 个字节中(因为联合的大小是最大成员的大小)。但我只是不明白为什么所有 4 个字符成员都存储在相同的字节,而人们会假设它们将分布在两个字节中并存储为

c1,c3--->first byte
c2,c4--->2nd byte

或者更清楚

Byte1     Byte2
----short a----
----short b----
--c1--    --c2--
--c3--    --c4--

将它们存储为的原因是什么

Byte1     Byte2
----short a----
----short b----
--c1-- 
--c2--
--c3--    
--c4--

这背后的原因是什么?她的程序:

#include<stdio.h>

int main(void)
{
    union test
    {
        short a,b;
        char c1,c2,c3,c4;
    } var= {65};
    printf("%hd,%hd,%c,%c,%c,%c",var.a,var.b,var.c1,var.c2,var.c3,var.c4);
}

结果:

   65,65,A,A,A,A
4

4 回答 4

3

因为工会不是这样运作的。

如果您希望它像这样工作,您应该混合使用匿名结构和联合,例如:

union test
{
    short a,b;
    struct { char c1,c2; };
    struct { char c3,c4; };
};

编辑:

看起来匿名结构是非标准的。如果你想要符合标准的代码,你必须使用普通的结构,并处理更长的语法。

union test
{
    short a,b;
    struct c { char _1,_2; };
    struct d { char _3,_4; };
};

test var;
if(var.c._1 == var.d._3) {}
于 2013-05-17T21:20:06.690 回答
2

有人会假设它们将分布在两个字节中

为什么会有人假设?这肯定是错的。工会的所有成员都必须从同一个内存位置开始。

C11 标准,第 6.7.2.1.6 节:

  1. 如 6.2.5 所述,结构是由一系列成员组成的类型,其存储按有序顺序分配,联合是由一系列成员存储重叠的类型。

第 6.7.2.1.16 节:

  1. 工会的规模足以容纳其最大的成员。任何时候最多可以将其中一个成员的值存储在联合对象中。一个指向联合对象的指针,经过适当的转换,指向它的每个成员(或者如果一个成员是一个位域,则指向它所在的单元),反之亦然。
于 2013-05-17T21:19:11.880 回答
0

因为这正是联合所做的:所有成员将占用相同的地址,并且联合的大小将等于具有最大大小的变量的大小。(这听起来很奇怪)

例如:

union group {
    double d;
    char c;
} u;

该联合的大小将是 的大小,double因为所有成员都将从内存中的同一位置开始,并且 adouble的大小保证大于 a 的大小char

编辑:实现这一点的一个很好的论点是节省内存。C 是在 70 年代发明的,当时内存非常稀缺,所以在当时,如果您只需要一个数据而不需要两个变量,那么您可以通过在一个联合中组合两个变量来产生影响。

于 2013-05-17T21:19:26.440 回答
0

C 中的联合仅与其最大的包含类型一样大。它们的每一种类型都覆盖在相同的内存空间上。

您提供的代码创建了一个size短联合,它有两个short引用和四个char引用。

于 2013-05-17T21:19:42.980 回答