![]() |
1
28
该标准回答C99标准第9.5节中的所有问题,或C99标准(或C11标准的第6段)第5.5.2.3段5的所有问题:
这意味着每个成员共享相同的内存区域。那里 是 最多有一个成员处于活动状态,但您无法确定是哪个成员。您必须将有关当前活动成员的信息存储在其他地方。除了联合之外,存储这样一个标志(例如,有一个整数作为类型标志的结构,一个联合作为数据存储)将为您提供一个所谓的“区分联合”:一个知道它中当前是什么类型的“活动联合”。
一个常见的用法是在lexers中,您可以拥有不同的令牌,但是根据令牌,您有不同的信息要存储(放置
标准允许您访问
存在允许访问所有成员的编译器扩展,而不管当前存储哪个成员的值。它允许对每个成员中不同类型的存储位进行有效的重新解释。例如,以下内容可用于将浮点变量分解为2个无符号短路:
这在编写低级代码时非常方便。如果编译器不支持该扩展,但您仍然支持它,那么您将编写结果未定义的代码。因此,如果您使用这个技巧,一定要确保您的编译器支持它。 |
![]() |
2
53
一
上面的一个例子
边注
正如所指出的
Stefano
,实际空间任意类型(
|
![]() |
3
15
它取决于编译器和选项。
此输出: 十三 四 十六 如果我记得正确,这取决于编译器放入分配空间的对齐方式。所以,除非您使用一些特殊的选项,否则编译器会将填充放到联合空间中。 编辑:使用gcc,需要使用pragma指令
这个输出 十三 四 十三 您也可以从拆解中看到它(为了清晰起见,删除了一些printf)
其中唯一的区别是在main+13中,编译器在堆栈0xd上分配而不是在堆栈0x10上分配。 |
![]() |
4
10
联合没有活动数据类型的概念。你可以自由地读写工会的任何“成员”:这由你来解释你所得到的。 因此,联合的sizeof总是其最大数据类型的sizeof。 |
![]() |
5
3
大小至少为最大的撰写类型。没有“活动”类型的概念。 |
![]() |
6
2
您真的应该将联合视为其中最大数据类型的容器,并结合转换的快捷方式。当您使用其中一个较小的成员时,未使用的空间仍然存在,但它只是保持未使用状态。 在Unix中,经常会看到这与ioctl()调用结合使用,所有ioctl()调用都将传递同一个结构,该结构包含所有可能响应的联合。例如。 此示例来自/usr/include/linux/if.h,在ioctl()中使用此结构配置/查询以太网接口的状态,请求参数定义联合的哪个部分实际使用:
|
![]() |
7
0
例子:
|
![]() |
8
0
是的 ,工会的大小是其最大成员的大小。 例如:
输出:
这里最大的成员是
它由编译器内部处理。假设我们正在访问union的一个数据成员,那么我们就不能访问其他数据成员,因为我们可以访问union的单个数据成员,因为每个数据成员共享相同的内存。通过使用联合,我们可以节省很多宝贵的空间。 |
![]() |
Community wiki · C中有哪些耗时的操作? 1 年前 |
![]() |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
![]() |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
![]() |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |