#include <iostream>
int main()
{
int a;
int *p = &a;
std::cout << *p << "\n";
}
在这个程序中,当我离开a
未初始化并尝试获取指针的输出时,它给了我-2
. 但是当我用一个值初始化a
时,打印*p
给了我这个值。为什么-2
当我离开a
未初始化时它会给出?
因为使用未初始化的变量,无论是直接的还是间接的(通过指针或引用),都是未定义的行为[1][2][3]。
[1] 这基本上意味着那些未初始化的变量将具有不确定的值。
[2] 我敢肯定,您永远不会喜欢代码中任何地方的未定义行为。
[3] 黄金法则:提防未定义的行为。
a在堆栈上分配。它包含分配时偶然出现的任何内容。与全局不同,C中的局部变量不会隐式初始化为 0(或其他任何值)。
可能如果您多次运行程序,它会给出不同的值(或没有)。
在 c++ 中将指针分配给未定义的值是非法的。a
未初始化。当您取消引用它时,它只是指向一个垃圾值。