联盟比C中的结构更好的选择

时间:2013-11-17 13:31:51

标签: c struct unions

我正在寻找使用Union比C中的Structure更好的选择吗?

我不是在寻找两者之间的区别。我知道C中的结构和联合概念,以及差异。

我看了Difference between a Structure and a Union in C这个问题,这是不可能重复的。

4 个答案:

答案 0 :(得分:4)

好吧,考虑一下您希望能够更改整数的每个字节的情况。您可以使用整数的并集,例如,4个字符的数组。

union Example
{
   int x;
   char array[4];
};

这样,通过修改其中一个字符,您还可以修改相应的字节(union成员共享内存空间!)。

然而,这并不意味着工会比结构更好,它们是非常不同的,并且比较两者并不真正有意义。这只是工会如何适合做某些事情的一个例子。

答案 1 :(得分:2)

union是一种类型,使您可以在同一个内存空间中存储不同的数据类型(但不能同时)。 一个典型的用途是设计用于按某种顺序保存类型混合的表格,既不是常规的也不是事先已知的。通过使用一个联合数组,您可以创建一个大小相等的数组,每个单元可以容纳各种数据类型。 union的设置方式与结构的设置方式大致相同 您可能使用union的另一个位置是存储信息取决于其中一个成员的结构。例如,假设您有一个代表汽车的结构。如果汽车归用户所有,则需要一个描述所有者的结构成员。如果汽车是租赁的,您希望会员描述租赁公司。然后你可以按照以下几点做点什么:

struct owner {
    char socsecurity[12];
    ...
};

struct leasecompany {
    char name[40];
    char headquarters[40];
    ...
};

union data {
    struct owner owncar;
    struct leasecompany leasecar;
};

struct car_data {
    char make[15];
    int status; /* 0 = owned, 1 = leased */
    union data ownerinfo;
    ...
};

假设flitcar_data结构。如果flits.status0,则该程序可以使用flits.ownerinfo.owncar.socsecurity,如果flits.status1,则该程序可以使用 flits.ownerinfo.leasecar.name

<小时/> 这完全取自书籍C Primer Plus 5th Edition

答案 2 :(得分:1)

当您拥有可以以不同方式解释但始终使用相同内存的数据流时,union非常有用。

一个很好的例子是i.E. 32位值(DWORD)。您可以将其读取为2 * 16位值,1 * 32位值或4 * 8位值,因此如果您需要单独地对这些部分进行处理,则可以创建联合。这样您就不必使用位掩码等。您甚至可以使用union来创建单个位或位组,并将它们作为单个变量访问。

使用它来保存内存是不需要IMO的,因为你总是可以转换为不同的结构。

答案 3 :(得分:0)

Union用于需要以多种方式读取数据blob或以不同于写入的格式读取数据的情况。这是struct无法处理的东西,除非考虑将数据转换为不同的结构。

在某些编码约定中可以禁止强制转换(特别是如果通过void ptr转换),因为这会使静态分析变得困难。即便如此,比较还是在union和cast之间,而不是在union和struct之间。