разыменовывая NULL
указатель (или какой-либо адрес за пределами текущего address space, часто в virtual memory) в C являетсяне в exception, но некоторые undefined behavior (часто segmentation fault). Вам really следует избегать UB.
По определению неопределенного поведения мы не можем объяснить это, не сводясь к очень конкретным деталям реализации (компилятор, время выполнения, оптимизация, ASLR, машинный код, фаза луны, ...).
malloc
библиотека функция может (и.) Не работает. Вы всегда должны проверить его, по крайней мере, как:
int *b = malloc(sizeof(int));
if (!b) { perror("malloc of int"); exit(EXIT_FAILURE); };
Чтобы вызвать отказ malloc
(но очень часто первые несколько звонков в malloc
все равно получится) можно опустить доступное адресное пространство для вашей программы. В Linux используйте ulimit
в родительской оболочке или вызовите setrlimit(2).
Кстати, вы могли бы даже связать с вашим собственным malloc
, который всегда неисправный:
// a silly, standard conforming, malloc which always fail:
void* malloc(size_t sz) {
if (sz == 0) return NULL;
errno = ENOMEM;
return NULL;
}
Язык программированияC не имеет исключений. C++ (и Ocaml, Java, ....) делает (с catch
& throw
заявлениями). Поднятие исключения - это нелокальное изменение потока управления. В стандарте C для этой цели вы можете использовать longjmp
. В C++ разыменовании nullptr
является UB (и не вызывает никакого исключения-указателя, которое не существует в C++).
возможно дубликат [указатель Understanding NULL в C] (http://stackoverflow.com/questions/29379663/understanding-null-pointer-in-c) – kittykittybangbang
он объяснил исключение нулевого указателя, , но я хотел бы знать, как ввести здесь исключение нулевого указателя. Вы можете удалить флаг дубликата – Madara
В C нет исключений, поэтому исключение-указатель 'NULL' не может быть в C. –