如果发生这种情况,我们用两个值初始化联合,我知道它将采用int数,但我真的很想知道幕后发生的事情
reloadRowsAtIndexPaths
答案 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
都不会触发额外的初始化程序的错误(尽管总是按照标准要求给出警告)。