Значение нулевого указателя представляет собой четко определенное «нигде»; это недопустимое значение указателя, которое гарантированно сравнивается с любым другим значением указателя. Попытка разыменования нулевого указателя приводит к неопределенному поведению и, как правило, приводит к ошибке во время выполнения, поэтому вы должны убедиться, что указатель не равен NULL, прежде чем пытаться разыменовать его. Ряд библиотечных функций C и C ++ вернет нулевой указатель, указывающий на состояние ошибки. Например, библиотечная функция malloc
будет возвращать нулевое значение указателя, если она не сможет выделить количество запрошенных байтов, а попытка получить доступ к памяти через этот указатель (обычно) приведет к ошибке времени выполнения:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
Поэтому мы должны убедиться, что malloc
вызов выполнен успешно, проверив значение параметра p
против NULL:
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
Теперь, подожди минутку, это будет немного неровно.
Существует значение нулевого указателя и константа нулевого указателя , и они не обязательно совпадают. Указатель нулевой значение является любое значение , лежащие в основе использования архитектуры не представляют «нигде». Это значение может быть 0x00000000, или 0xFFFFFFFF, или 0xDEADBEEF, или что-то совершенно другое. Не думайте , что указатель нулевого значение всегда 0.
Указатель нулевого постоянная , Ото, всегда 0-значное интегральное выражение. Что касается вашего исходного кода , 0 (или любое интегральное выражение, которое оценивается как 0) представляет нулевой указатель. И C, и C ++ определяют макрос NULL как константу нулевого указателя. Когда ваш код скомпилирован, константа нулевого указателя будет заменена соответствующим значением нулевого указателя в сгенерированном машинном коде.
Также имейте в виду, что NULL - это только одно из многих возможных недопустимых значений указателя; если вы объявляете переменную автоматического указателя без явной инициализации, например,
int *p;
значение, изначально сохраненное в переменной, является неопределенным и может не соответствовать действительному или доступному адресу памяти. К сожалению, нет (портативного) способа узнать, является ли значение указателя, отличное от NULL, допустимым или нет, прежде чем пытаться его использовать. Поэтому, если вы имеете дело с указателями, обычно рекомендуется явно инициализировать их значением NULL, когда вы их объявляете, и устанавливать их в NULL, когда они не указывают ни на что активно.
Обратите внимание, что это больше проблема в C, чем в C ++; идиоматический C ++ не должен все время использовать указатели.