我正在寻找使用Union比C中的Structure更好的选择吗?
我不是在寻找两者之间的区别。我知道C中的结构和联合概念,以及差异。
我看了Difference between a Structure and a Union in C这个问题,这是不可能重复的。
答案 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;
...
};
假设flit
是car_data
结构。如果flits.status
为0
,则该程序可以使用flits.ownerinfo.owncar.socsecurity
,如果flits.status
为1
,则该程序可以使用
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之间。