【发布时间】:2016-02-21 07:58:44
【问题描述】:
我犯了一个错误,在函数中使用了未初始化的局部变量,碰巧发现一行“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;
}
我注释掉的行会将输出从 (unknown#;777) 更改为 (unknown#;hello!;0)。有人可以帮忙解释一下吗? 谢谢。
【问题讨论】:
-
为什么这被标记为 C++?
-
您正在打印一个未初始化的变量?您认为它可能是什么价值 - 可能是什么?
-
因为
cout是C++? -
无法定义未定义的行为 - 即。查看未初始化的变量正在查看任意内存 - 该内存中的内容可能取决于之前执行的代码,但可能会或可能不会重复,具体取决于您的环境
-
i被(至少大多数编译器)放置在堆栈上,并且您读取的值恰好在那里。函数调用(例如输出到 cout)也使用堆栈,因此 cout 会以这种方式更改堆栈。
标签: c++