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++ 中什么使未初始化的指针为真 - 并导致崩溃
为什么 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 之外,其他指针值对于间接访问来说也是不安全的。