C 语言中,联合体(Union)何时比结构体(Structure)更好?

3

我正在寻找一种情况,其中在C语言中使用Union比Structure更好的选择是什么?

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

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


可能是 C 语言中结构体和联合体的区别 的重复问题。 - devnull
2
unionstruct是不同的,且不能相互比较。 - UltraInstinct
1
@AkiSuihkonen:什么源代码?我找不到一个场景,其中“联合比结构更好”的选项,应该放哪个源代码? - Denim Datta
1
@B...,问题并不是指“绿色领带和黑色领带哪个更好”。问题是,在什么情况下使用联合体比结构体更好,就像“用锤子还是螺丝刀敲钉子更好”一样。 - Devolus
1
@Denim,确实如此--有些人会立即提出问题,这些问题不属于需要或必须提供源代码的格式。 - Aki Suihkonen
显示剩余10条评论
4个回答

4

假设您想要更改一个整数的每个字节,您可以使用该整数的联合体以及一个由4个字符组成的数组。

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

那么,通过修改其中一个字符,您也可以修改相应的字节(联合成员共享内存空间!)。
但是,这并不意味着联合比结构体更好,它们非常不同,比较这两者并没有意义。这只是一个示例,说明联合适合做某些事情。

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;
    ...
};

假设flits是一个car_data结构体。如果flits.status0,程序可以使用flits.ownerinfo.owncar.socsecurity;如果flits.status1,程序可以使用flits.ownerinfo.leasecar.name
这段内容摘自C Primer Plus第5版

@user2018675;这不是抄袭。我目前正在阅读同样的书(关于结构体和联合体):P。 - haccks
我认为,如果你引用了别人的东西却没有给予应有的信任,让人误以为是你自己说的话,那么这就是抄袭。 - user2018675
但是现在你已经添加了源代码,我认为你的回答没有任何问题。 - user2018675
@user2018675;你说得对。在回答完问题后,我一直在寻找正确的格式(我已经添加到我的答案中)来添加参考文献。这就是为什么添加参考文献会延迟的原因。 - haccks

1

union(联合体)在数据结构可以以不同的方式解释,但始终使用相同的内存时非常有用。

一个很好的例子是32位值(DWORD)。您可以将其读取为2个16位值、1个32位值或4个8位值,因此如果您需要单独访问这些部分,则创建一个union很有用。这样,您就不必使用位掩码等操作了。您甚至可以创建单独的位或位集,并将它们作为单独的变量访问,使用union。

我认为,使用它来保留内存实际上并不是必要的,因为您始终可以将其转换为不同的结构。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接