在代码块(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会为两者产生运行时错误),因为两者都是错误的指针。怎么能解释这个?
答案 0 :(得分:15)
您对运行时错误的期望是有缺陷的。
取消引用具有任意值的未初始化/无效指针可以执行任何操作。
这意味着潜在的症状包括:
等等。
对于解除引用NULL也是如此,但现代商品硬件倾向于特别处理NULL解除引用,通常保证分段错误以帮助诊断。显然,CPU不能为任意指针值执行此操作,因为它们可能是有效的!
答案 1 :(得分:3)
你的第一个例子,
int *p;
cout << *p;
正在使用wild pointer并尝试取消引用它。那个指针的另一端是什么?它是一个会导致运行时错误的系统位置吗?它是程序中另一个变量x
的地址吗?它是您的网络浏览器使用的内存吗?尝试取消引用并读取或写入此位置undefined behavior,无法保证会发生什么(在极端情况下报告time travel)。
取消引用空指针(指向0
地址的指针)然而,is also undefined,但可能会导致分段错误 - 运行时错误。
答案 2 :(得分:0)
在第一个代码中,因为我们没有设置指针,所以它采用随机值地址...这可能有一些垃圾值。 但在第二种情况下,指针没有指向任何地址,所以很明显它会失败