未定义的指针变量是否为 NULL?

Is an undefined pointer variable NULL?

提问人:Jonas 提问时间:1/5/2023 更新时间:1/5/2023 访问量:148

问:

当我在两个不同的地方运行时,相同的代码会给我两个不同的输出。这是代码;

#include <iostream>
using namespace std;
struct test {
    int val;
};
int main() {
    test* a;
    cout << (a == NULL) << endl;
}

我得到 1 作为输出:

enter image description here

或 0:

enter image description here

那么,未定义的指针变量是否等于 NULL?造成这种差异的原因可能是什么?

C++ 指针 null

评论

9赞 Yksisarvinen 1/5/2023
你已经回答了自己:这是不确定的。你永远不能依赖未初始化的指针的值,事实上,仅仅读取这种变量的值的行为就会导致一些讨厌的鼻魔
0赞 user253751 1/5/2023
(我认为这是一个非常罕见的计算机系统,读取未初始化的值会导致崩溃,但人们以前已经制作了类似的系统)
1赞 john 1/5/2023
初学者有一个普遍的误解,即 C++ 为所有可编译代码定义了一些行为。对于某些语言来说可能是正确的,但对于 C++ 来说却不是这样。未定义意味着未定义,
0赞 Eljay 1/5/2023
此代码在我的计算机上崩溃,因为未初始化。a
2赞 PaulMcKenzie 1/5/2023
欢迎来到 C++ 的世界,那里有未定义的行为。这也表明,如果目标是查看行为是否被定义,那么你永远不能用 C++ 编写“概念证明”程序。太多新的C++程序员会编写你的程序,如果他们在学校和家里尝试这个程序,并得到null作为值,他们会相信它“有效”——但它真的不起作用。您要么知道行为未定义,要么不知道行为未定义。不幸的是,事情就是这样——你会从经验中学习。

答:

2赞 Chris 1/5/2023 #1

如果不显式初始化,则只会将其初始化为 或 在文件级别(“全局”)声明时,或者使用 .NULLnullptrstatic

否则,它是未定义的。它可能是,也可能是任何其他值。你假设它会是 ,所以可能发生的最危险的事情是它巧合地出现在你运行的任何测试中,因为这不会检查你的假设。NULLNULLNULL

这些指针变量初始化为 。NULL

int *p;

int main() {
    // ...
}
int main() {
    static int *p;

    // ...
}
0赞 dev-one 1/5/2023 #2

首先,它是未定义的。 但通常,如果您在 Visual Studio 或类似平台中运行它,在调试模式下,编译器可能会将其初始化为 null 终止指针,但在发布模式下,它只是“垃圾”,它将从“==”比较中返回 0。 希望这有帮助!

评论

3赞 Mark Ransom 1/5/2023
在调试模式下,它可能会初始化为一个无意义的值,该值比 null 更有可能崩溃。
1赞 user4581301 1/5/2023
上述评论的附录:魔术调试值。当你看到其中一个吸盘,加上或减去一个小的偏移量时,你的程序通常会试图告诉你一些事情。