为什么不解除引用null崩溃我的程序?

时间:2012-04-30 00:20:13

标签: objective-c macos cocoa

我编写了以下代码来引发崩溃(我正在使用CrashReporter测试一些issues):

int *nullp = NULL;
int val = *nullp;    
NSLog(@"Hello world %d", val);

在一个全新的项目中(我把它放在app delegate的applicationDidFinishLaunching:中),它会按预期崩溃。但是当我将它添加到我现有的一个项目中时,它不会崩溃!实际上,它最终会将“Hello world 0”打印到系统日志中。

这对我没有任何意义。为什么空取消引用不会导致崩溃?

3 个答案:

答案 0 :(得分:8)

去除NULL具有未定义的行为,它不必导致崩溃。

话虽这么说,如果你在两个项目中有不同的编译器选项,你很有可能为这些案例获得不同的行为。有关未定义的行为,请参阅此LLVM blog post

答案 1 :(得分:2)

取消引用空指针是未定义的行为 - 即没有规则说必须使应用程序崩溃。

不同的编译器会给出不同的结果 - 不同的编译器选项(例如发布与调试配置)也会影响事物。

如果你试图强制崩溃,你总是可以开始写空指针......

答案 2 :(得分:0)

int * nullp = NULL;或者int * nullp = 0是相同的,这意味着指针nullp没有指向内存位置。由于NULL == 0,它打印零并且不会崩溃