两个单独声明但未初始化的局部变量是否可以保持相同的值?

时间:2017-08-08 19:52:30

标签: c

例如,请考虑以下事项:

int main(void) {
    int K;
    int Y;
    printf("%d", K==Y);
    return 0;
}

输出是否可能是1

3 个答案:

答案 0 :(得分:3)

读取未初始化变量的值的结果是未定义的,这意味着任何事情都可能发生。我想说输出可能是1。

答案 1 :(得分:3)

这里的问题是变量KY都有自动存储持续时间,而且它的地址永远不会被采用 - 它可能已经用{{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
  • 可能没有任何输出
  • 计算机可能会在9个月左右的时间内回溯,这将是尝试纠正一些历史事故或至少将它们货币化的方便方法。唉不太可能发生。