4

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

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

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

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

4

3 回答 3

8

取消引用 NULL 具有未定义的行为,它不必导致崩溃。

话虽如此,如果您在两个项目中有不同的编译器选项,那么您很有可能在这些情况下获得不同的行为。请参阅有关未定义行为的 LLVM 博客文章。

于 2012-04-30T00:23:06.087 回答
2

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

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

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

于 2012-04-30T00:33:01.353 回答
0

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

于 2018-03-22T18:08:51.320 回答