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

时间:2010-10-23 08:19:10

标签: c++ c struct unions

  

可能重复:
  Difference between a Structure and a Union in C

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

7 个答案:

答案 0 :(得分:24)

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

例如:

union foo
{
 int x;
 int y;
};

foo f;
f.x = 10;
printf("%d\n", f.y);

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

但是如果我们使用结构:

struct foo
{
 int x;
 int y;
};

foo f;
f.x = 10;
f.y = 20;
printf("%d %d\n", f.x, f.y);

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

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

答案 1 :(得分: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);

其中int是16位(在微控制器上使用)。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

对于这有什么好处,有一个未经证实的例子可能更有用。 (我说“无可挽回”,因为联盟的大多数使用都是非常危险的。从大端到小端硬件的爆炸工会以最(最初)神秘的方式打破了。)(当然,我已经写入比特冲突的联合会撕掉浮点数来实现数量级比图书馆数学运算更快的速度。我只是添加关于哪些成员应该具有相同地址的断言。)

    struct option1 { int type; /* other members */ };
    struct option2 { int type; /* other members */ };
    struct option3 { int type; /* other members */ };
    union combo {
      int type; // guaranteed to exactly overlap with the structs' ints type.
      struct option1;
      struct option2;
      struct option3;
    };
   // ...
   void foo(union combo *in) {
      switch(in.type) {
        case 1: { struct option1 *bar = in;  //then process an option1 type of request }
        case 2: { struct option2 *bar = in;  //then process an option2 type of request }
        case 3: { struct option3 *bar = in;  //then process an option3 type of request }
      }

这种结构在X编程和其他需要创建可以接收许多不同类型消息(具有不同参数和布局要求)的函数的情况下非常常见。

答案 4 :(得分:2)

我认为你可以想到一个联合的一种方式是它是一组不同类型的别名到一个内存块,其中union的每个成员都是一个给定类型的“别名”。每个别名都指向内存中的相同地址。如何解释该地址的位由别名'type。

确定

union所占用的内存量总是等于或可能大于union的最大大小的“成员”(由于对齐限制)。

答案 5 :(得分:1)

运行此程序并查找输出。

#include< stdio.h>

int main()
{
  union _testUnion
  {
    long long x;
    long long y;
  } testUnion;

  struct _testStruct
  {
    long long x;
    long long y;
  }testStruct;
  printf("Sizeof Union %d\n",sizeof(testUnion));
  printf("Sizeof Struct %d\n",sizeof(testStruct));
  return;
}

你会发现struct的大小是union的两倍。这是因为union已经为一个变量分配了空间,而struct已经分配了两个变量。

答案 6 :(得分:1)

这里的大多数答案都是正确的。联合本质上是一种以不同方式访问相同数据的方法(例如,您可以访问/解释4个字节的内存为1个整数,或4个字符)。你知道的结构是直截了当的 - 一组具有自己记忆的不同的,独立的对象。

与Structs相比,通常在编程的后期阶段需要Unions。