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



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

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

但下面的代码略有变化,不会

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

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

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

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

为什么下面的代码会产生分段故障!!!

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


但以下代码略有更改,不会

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


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

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

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

编译器通常无法检测到所有复杂的违规行为。然而,运行时消毒剂甚至可以检测到复杂的病例。示例输出:

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

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

因为您的单元化指针被隐式转换为布尔值。其中0转换为false,其他值转换为true。

最新更新