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

why C++ recognizes an uninitialized raw-pointer as true?

为什么以下代码会产生 seg-fault

//somewhere in main
    ...
    int *pointer;
    if(pointer)
        cout << *pointer;
    ...

但稍作改动后的代码并没有

//somewhere in main
    ...
    int *pointer = nullptr;
    if(pointer)
        cout << *pointer;
    ...

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

Why C++ Recognizes an uninitialized Raw Pointer (or say a daemon) as true?

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

Why the following code produces a SEGMENTATION FAULT!!!

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


But slightly changed following code doesn't

因为你没有在改变的程序中读取一个不确定的值,而且那个程序的行为是明确定义的,定义的行为是不会输入 if 语句。


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

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

warning: 'pointer' is used uninitialized [-Wuninitialized]
if(pointer)
   ^~

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

==1==WARNING: MemorySanitizer: use-of-uninitialized-value

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

因为您未初始化的指针被隐式转换为布尔值。 其中 0 转换为 false,所有其他值转换为 true。