解除引用NULL指针和未初始化指针之间的区别

Gau*_*ain -7 c++ pointers

在代码块(C++)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int *p;
    cout<<*p;
}
Run Code Online (Sandbox Code Playgroud)

产生垃圾价值,而

#include<bits/stdc++.h>
using namespace std;
int main(){
    int *p=NULL;
    cout<<*p;
}
Run Code Online (Sandbox Code Playgroud)

导致运行时错误.我预计两者的运行时错误(ideone会为两者产生运行时错误),因为两者都是错误的指针.怎么能解释这个呢?

Lig*_*ica 15

您对运行时错误的期望是有缺陷的.

取消引用具有任意值的未初始​​化/无效指针可以执行任何操作.

这意味着潜在的症状包括:

  • 什么都没发生
  • 有事情发生
  • 发生运行时错误
  • 您的源代码是自发编辑的,以使用适当的标准标头而不是误导性地破解实现"位"
  • 你在评论部分的态度有了神奇的改善
  • 你的猫被谋杀了
  • 你的猫没有被谋杀
  • 你的猫被谋杀而没有被谋杀
  • 你的猫自杀了
  • 你的猫内有一个黑洞
  • 一只猫在黑洞内打开

等等.

对于解除引用NULL也是如此,但是现代商品硬件倾向于特别处理NULL解除引用,通常保证分段错误以帮助诊断.显然,CPU不能为任意指针值执行此操作,因为它们可能是有效的,只要它知道!

  • /我试图想象一只开放在黑洞内的猫并且悲惨地失败:) (3认同)
  • @TC:可能像这样的summat:https://thefinchandpea.files.wordpress.com/2014/08/blackhole.jpg?w = 500&h = 371 (3认同)