-2
#include <iostream>

int main()
{
    int a;
    int *p = &a;
    std::cout << *p << "\n";
}

在这个程序中,当我离开a未初始化并尝试获取指针的输出时,它给了我-2. 但是当我用一个值初始化a时,打印*p给了我这个值。为什么-2当我离开a未初始化时它会给出?

4

3 回答 3

6

因为使用未初始化的变量,无论是直接的还是间接的(通过指针或引用),都是未定义的行为[1][2][3]


[1] 这基本上意味着那些未初始化的变量将具有不确定的值。
[2] 我敢肯定,您永远不会喜欢代码中任何地方的未定义行为
[3] 黄金法则:提防未定义的行为

于 2013-06-07T07:24:02.253 回答
1

a在堆栈上分配。它包含分配时偶然出现的任何内容。与全局不同,C中的局部变量不会隐式初始化为 0(或其他任何值)。

可能如果您多次运行程序,它会给出不同的值(或没有)。

于 2013-06-07T07:24:40.240 回答
0

在 c++ 中将指针分配给未定义的值是非法的。a未初始化。当您取消引用它时,它只是指向一个垃圾值。

于 2013-06-07T07:25:31.307 回答