如果我们同时初始化所有工会成员会怎样?

时间:2018-10-14 17:36:58

标签: c

如果发生这种情况,我们用两个值初始化联合,我知道它将采用int数,但我真的很想知道幕后发生的事情

reloadRowsAtIndexPaths

2 个答案:

答案 0 :(得分:0)

该编译了吗?它不应该。每次重新使用联合时,分配的内存都会被覆盖。 您可以定义具有多个成员的联合,但是在任何给定时间只能有一个成员包含一个值。联合提供了一种将相同内存位置用于多种用途的有效方法。

答案 1 :(得分:0)

在没有对联合变量的“初始化太多”的诊断之前,问题中的代码不应编译。您可能还会收到有关useless storage class specifier in empty declaration的警告,因为typedef实际上并未为union x定义别名。

假设您修改了代码以使用指定的初始化程序,如下所示:

#include <stdio.h>

union x
{
    int y;
    char x[6];
};

int main(void)
{
    union x  first = { .y = 4, .x = "AAAAA" };
    printf("%d\n", first.y);
    printf("%s\n", first.x);
    return 0;
}

这将编译并运行,但是在编译器设置为fussy的情况下,您可能会收到类似warning: initialized field overwritten [-Woverride-init]的警告。

请注意,上面显示的A的初始化程序中的.x比原始的少。这样可以确保该值是一个(空终止)字符串,而不仅仅是字节数组。在这种情况下,.x的指定初始化程序将覆盖.y的指定初始化程序,因此.x中的值是完全有效的。例如,我得到的输出是:

1094795585
AAAAA

十进制数字对应于十六进制0x41414141,这可能是预期的。

请注意,我删除了毫无意义的typedef。我的默认编译规则不接受该代码。我必须取消-Werror-Wextra选项才能进行编译。不带-Werror的警告而编译的原始代码将警告转换为错误。甚至添加-pedantic都不会触发额外的初始化程序的错误(尽管总是按照标准要求给出警告)。