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

时间:2015-08-04 17:35:36

标签: c++ pointers

在代码块(C ++)

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

产生垃圾值,而

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

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

3 个答案:

答案 0 :(得分:15)

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

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

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

  • 没有任何反应
  • 发生了什么事
  • 发生运行时错误
  • 您的源代码会自动编辑,以使用适当的标准标题,而不是误导性地执行黑客&#34;位&#34;
  • 你在评论部分的态度有了神奇的改善
  • 你的猫被谋杀了
  • 你的猫没有被谋杀
  • 你的猫被谋杀而未被谋杀
  • 你的猫谋杀了自己
  • 在你的猫眼内打开一个黑洞
  • 一只猫在黑洞内打开

等等。

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

答案 1 :(得分:3)

你的第一个例子,

int *p;
cout << *p;

正在使用wild pointer并尝试取消引用它。那个指针的另一端是什么?它是一个会导致运行时错误的系统位置吗?它是程序中另一个变量x的地址吗?它是您的网络浏览器使用的内存吗?尝试取消引用并读取或写入此位置undefined behavior,无法保证会发生什么(在极端情况下报告time travel)。

取消引用空指针(指向0地址的指针)然而,is also undefined,但可能会导致分段错误 - 运行时错误。

答案 2 :(得分:0)

在第一个代码中,因为我们没有设置指针,所以它采用随机值地址...这可能有一些垃圾值。 但在第二种情况下,指针没有指向任何地址,所以很明显它会失败