26

可能的重复:
C 中结构和联合之间的区别

我可以理解结构的含义。但是,我对联合和结构之间的区别有点困惑。联合就像一份记忆。究竟是什么意思。?

4

7 回答 7

27

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

例如:

union foo
{
 int x;
 int y;
};

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

在这里,我们将值 10 分配给foo::x。然后我们输出 的值foo::y,它也是10,因为 x 和 y 共享相同的内存。请注意,由于联合的所有成员共享相同的内存,编译器必须分配足够的内存以容纳联合的最大成员。因此,包含 achar和 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);

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

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

于 2010-10-23T08:20:34.000 回答
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 位(用于微控制器)。

于 2010-10-23T08:47:53.823 回答
4

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

于 2010-10-23T08:21:46.947 回答
3

有一个不做作的例子来说明这有什么好处可能会更有用。(我之所以说“不做作”,是因为 union 的大多数 bit-banging 使用都非常危险。从 big-endian 到 little-endian 硬件的 bit-banging union 以最(最初)神秘的方式中断。)(当然,我已经编写位碰撞联合来分解浮点数以实现数量级比库数学函数快的数量级。我只是添加关于哪些成员应该具有相同地址的断言。)

    struct option1 { int 类型;/* 其他成员 */ };
    struct option2 { int 类型;/* 其他成员 */ };
    struct option3 { int 类型;/* 其他成员 */ };
    联合组合{
      整数类型;// 保证与结构的 ints 类型完全重叠。
      结构选项1;
      结构选项2;
      结构选项3;
    };
   // ...
   void foo(联合组合 *in){
      开关(输入类型){
        案例 1: { struct option1 *bar = in; //然后处理一个option1类型的请求}
        案例 2: { struct option2 *bar = in; //然后处理一个option2类型的请求}
        案例 3: { struct option3 *bar = in; //然后处理一个option3类型的请求}
      }

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

于 2010-10-23T08:59:12.743 回答
2

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

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

于 2010-10-23T08:33:21.367 回答
1

运行这个程序并找出输出。

#include <stdio.h>

主函数()
{
  联合_testUnion
  {
    长长x;
    长长y;
  } 测试联合;

  结构 _testStruct
  {
    长长x;
    长长y;
  }testStruct;
  printf("联合大小%d\n",sizeof(testUnion));
  printf("结构体的大小 %d\n",sizeof(testStruct));
  返回;
}

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

于 2010-10-23T09:08:33.690 回答
1

这里的大多数答案都是正确的。联合本质上是一种以不同方式访问相同数据的方法(例如,您可以将 4 个字节的内存访问/解释为 1 个整数或 4 个字符)。如您所知,结构很简单——一组不同的、独立的对象,它们有自己的内存。

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

于 2010-10-23T10:10:48.820 回答