C中"union"和"struct"之间的主要区别是什么?

Vin*_*nay 21 c c++ struct unions

可能重复:
C中结构和联合之间的差异

我能理解结构意味着什么.但是,我对union和struct之间的区别感到困惑.联盟就像是记忆的一部分.究竟是什么意思.

Cha*_*via 24

通过联合,所有成员共享相同的内存.使用结构,它们不共享内存,因此内存中的不同空间被分配给结构的每个成员.

例如:

union foo
{
 int x;
 int y;
};

foo f;
f.x = 10;
printf("%d\n", f.y);
Run Code Online (Sandbox Code Playgroud)

在这里,我们将值10分配给foo::x.然后我们输出值foo::y,也是 10,因为x和y共享相同的内存.请注意,由于联合的所有成员共享相同的内存,因此编译器必须分配足够的内存以适合联合的最大成员.所以包含a char和a 的联合long需要足够的空间来适应long.

但是如果我们使用结构:

struct foo
{
 int x;
 int y;
};

foo f;
f.x = 10;
f.y = 20;
printf("%d %d\n", f.x, f.y);
Run Code Online (Sandbox Code Playgroud)

我们将10分配给x,将20分配给y,然后将它们打印出来.我们看到x是10而y是20,因为x和y不共享相同的内存.

编辑:还要注意上面的Gman的评论.我提供的联盟示例仅用于演示目的.实际上,您不应该写入联合的一个数据成员,然后访问另一个数据成员.通常这只会导致编译器将位模式解释为另一种类型,但是您可能会得到意外的结果,因为这样做是未定义的行为.

  • 值得指出的是,工会的原因是代表A类或B类的东西,但不能同时代表两种类型.它松散地对应于ML,Haskell等中的Sum类型. (3认同)

Sam*_*Sam 10

我已经使用联合将字节转换为其他类型的字节.我发现它比位移更容易.

union intConverter {
    int intValue;
    struct {
        byte hi;
        byte lo;
    } byteValue;
}

intConverter cv;
cv.intValue =1100;
printf("%X %X\n", cv.byteValue.hi, cv.byteValue.lo);
Run Code Online (Sandbox Code Playgroud)

其中int是16位(用于微控制器).

  • 这是一种使用它们的危险方式,因为无法保证您的"hi"字节实际上是高字节. (3认同)
  • 是的,你需要知道它运行的结尾 (3认同)

Ben*_*ley 5

联合体的每个成员共享相同的内存。这意味着,如果你改变其中之一,你就会改变其他人。如果成员属于不同类型,这可能会产生不可预测的结果。(并不完全不可预测,但很难预测,除非您了解构成数据成员的底层位模式)。