我犯了一个错误,在函数中使用了未初始化的局部变量,碰巧找到了一行" 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)。有人可以解释一下吗? 感谢。
答案 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);
覆盖我们之前创建的堆栈结构。