Почему разыменование null не приводит к сбою моей программы?

Я написал следующий код, чтобы вызвать сбой (я проверял некоторыевопрос с CrashReporter):

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

В совершенно новом проекте (я поместил его в приложение делегатаapplicationDidFinishLaunching:) происходит сбой, как и ожидалось. Но когда я добавляю его в один из моих существующих проектов, он не падает! Фактически, это приводит к выводу «Hello world 0» в системный журнал.

Это не имеет никакого смысла для меня. Почему нулевая разыменование не приводит к сбою?

Ответы на вопрос(3)

оно не должно вызывать сбой.

При этом, если у вас есть два варианта компиляции в двух проектах, у вас есть хороший шанс получить различное поведение в этих случаях. Посмотри этоLLVM сообщение в блоге о неопределенном поведении.

или int * nullp = 0 одинаковы, это означает, что указатель nullp не указывает на область памяти. Так как NULL == 0, он печатает ноль и не падает

т. Е. Не существует правила, которое говорит этодолже сбой вашего приложения.

Разные компиляторы будут давать разные результаты - и разные параметры компилятора (например, release vs debug config) также будут влиять на вещи.

Если вы пытаетесь вызвать сбой, вы всегда можете начать запись в нулевой указатель ...

ВАШ ОТВЕТ НА ВОПРОС