2011-09-30 1 views

ответ

7

ISO/IEC 9899: TC2 состояния в 6.3.2.3 Pointers

3 целочисленное постоянное выражение со значением 0, или такое выражение преобразованный к типу пустот *, называется пустой указатель constant.55) Если константа указатель NULL преобразуется в тип указателя, в результате указатель, называемый нулевой указатель, гарантированно сравнить с неравными указатель на любой объект или функции

макрос NULL, расширяет до значения , определяемой реализацией константа нулевой указатель.

Любые два нуль-указателя должны сравнивать одинаковые.

6

Да, есть. Стандарт диктует, что NULL всегда указывает на недопустимую память. Но он не указывает, что целочисленное представление указателя должно быть 0. Я никогда не сталкивался с реализацией, для которой NULL был отличным от 0, но это не предусмотрено стандартом.

Обратите внимание, что назначение указателя 0 указателю не означает, что указатель принимает целочисленное представление 0. Это означает, что значение специального указателя нулевой переменной присваивается переменной указателя.

+1

относящийся: http://c-faq.com/null/machexamp.html – nos

+7

Также обратите внимание, что 'int * ptr = 0;' всегда выводит нулевой указатель благодаря специальному правилу, потому что '0' является так называемая «константа нулевого указателя». Это выполняется, даже если вы находитесь в какой-то особой реализации, где нулевой указатель отличается от адреса 0. Однако 'int i = 0; int * ptr = (int *) i; 'не обязательно приводит к нулевому указателю. Таким образом, вы обычно не сталкиваетесь с «указателем, указывающим на адрес 0», за исключением контекста, где он является нулевым указателем, но стандарт разрешает его. –

+0

@ Давид, в вашем втором пункте вы подразумеваете «не», не так ли? И «NULL» всегда является значением «0» по определению стандарта, который может быть допустимым адресом, например, в ядре. Поэтому лучше лучше отличить «NULL» от внутреннего представления нулевого указателя, который, как вы говорите, может быть чем-то другим. –

3

Оценка литерала 0 в контексте указателя идентична NULL. Какой бы бит шаблон, используемый компилятором для представления указателя NULL, скрыт.

1

У старого comp.lang.c FAQ есть большой раздел по нулевому указателю, и его стоит прочитать.

comp.lang.c null pointers

0

Идея заключается в том, что NULL указатель должен каким-то образом представляют собой область памяти, что является недопустимым.
Так как в нижних сегментах памяти отображается код ОС, используется значение 0 (для представления указателя NULL), так как эта область в памяти не принадлежит к пользовательской программе, а сопоставляется с кодом ОС.

Смежные вопросы