为什么 C++ 将未初始化的原始指针识别为 true?

M. *_*man 0 c++ crash pointers segmentation-fault

为什么以下代码会产生段错误

//somewhere in main
    ...
    int *pointer;
    if(pointer)
        cout << *pointer;
    ...
Run Code Online (Sandbox Code Playgroud)

但稍微改变一下以下代码并不会

//somewhere in main
    ...
    int *pointer = nullptr;
    if(pointer)
        cout << *pointer;
    ...
Run Code Online (Sandbox Code Playgroud)

问题是在 C++ 中什么使未初始化的指针为真 - 并导致崩溃

eer*_*ika 6

为什么 C++ 将未初始化的原始指针(或者说守护进程)识别为 true?

行为可能看起来如此,因为程序的行为是未定义的。

为什么下面的代码会产生分段错误!

因为程序的行为是未定义的,而这是可能的行为之一。


但稍微改变一下以下代码并不会

因为您没有在更改的程序中读取不确定的值,并且该程序的行为已明确定义,并且定义的行为是不会输入 if 语句。


结论:不要读取未初始化的变量。否则你最终会得到一个损坏的、无用的程序。

尽管编译器不需要为您诊断未定义的行为,但幸运的是,高质量的编译器能够检测到这种简单的错误。这是示例输出:

warning: 'pointer' is used uninitialized [-Wuninitialized]
if(pointer)
   ^~
Run Code Online (Sandbox Code Playgroud)

编译器通常无法检测到所有复杂的违规行为。然而,运行时清理程序甚至可以检测到复杂的情况。输出示例:

==1==WARNING: MemorySanitizer: use-of-uninitialized-value
Run Code Online (Sandbox Code Playgroud)

除了读取未初始化的值之外,即使它已初始化,if (pointer)也不一定意味着您可以通过指针进行间接访问。它仅意味着指针不为空。除了 null 之外,其他指针值对于间接访问来说也是不安全的。