为什么 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。
为什么以下代码会产生 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。