怎么可能" printf(cout)"改变未初始化的局部变量?

时间:2016-02-21 07:58:45

标签: c++

我犯了一个错误,在函数中使用了未初始化的局部变量,碰巧找到了一行" cout"可以改变未初始化的价值。为简化起见,我将问题显示如下。

#include <stdio.h>

void foo(void){
  int i;
  printf("%d\n", i);
  i = 777;
}
int main(void){
  foo();
  //cout << "hello!" << endl;
  foo();
  return 0;
}

我注释掉的行会将输出从(未知#; 777)更改为(unknown#; hello !; 0)。有人可以解释一下吗? 感谢。

1 个答案:

答案 0 :(得分:0)

这是因为堆栈行为。

第一种情况:

int main(void){
  foo();
  foo();
  return 0;
}

第一个foo()构建堆栈并使用i初始化777的位置并保持原样。然后,对foo()的第二次调用位于i的位置仍为777的相同堆栈结构中。因此,在这种情况下,printf会打印777

第二种情况:

cout << "hello!" << endl实际上是在调用两个函数:

cout.operator<<("hello!");
cout.operator<<(endl);

覆盖我们之前创建的堆栈结构。