例如,请考虑以下事项:
int main(void) {
int K;
int Y;
printf("%d", K==Y);
return 0;
}
输出是否可能是1
?
答案 0 :(得分:3)
读取未初始化变量的值的结果是未定义的,这意味着任何事情都可能发生。我想说输出可能是1。
答案 1 :(得分:3)
这里的问题是变量K
和Y
都有自动存储持续时间,而且它的地址永远不会被采用 - 它可能已经用{{1}声明了} 存储类,C11 6.3.2.1p2表示
如果左值指定了一个可以使用寄存器存储类声明的自动存储持续时间的对象(从未使用过其地址),并且该对象未初始化(未使用初始化程序声明,并且未对其进行任何赋值)在使用之前),行为是未定义的。
因为行为未定义,所以可能发生任何事情。实际上存在这个规则是因为there are computer architectures where the processor registers would be set to "unset" upon an entry to a function - 访问这样的寄存器实际上会触发一个硬件陷阱,导致程序崩溃。
然后这个规则导致其他编译器用这些做各种各样的东西 - 可能是在分配变量之前没有为变量分配寄存器,所以你可能会看到变量的值改变执行,所以它可能是连续的调用
register
可能会打印不同的值。
答案 2 :(得分:2)
使用自动存储读取未初始化的局部变量具有未定义的行为。任何事情都可能发生:
1
0
Hello world