Есть ли в C разница между указателем NULL и указателем, который указывает на 0?Если да, то? - PullRequest
6 голосов
/ 30 сентября 2011

В C, в чем разница между указателем NULL и указателем, который указывает на 0?

Ответы [ 5 ]

7 голосов
/ 30 сентября 2011

ИСО / МЭК 9899: TC2 сообщает в 6.3.2.3 Pointers

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

Макрос NULL раскрываетсяс постоянной реализации нулевого указателя .

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

6 голосов
/ 30 сентября 2011

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

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

3 голосов
/ 30 сентября 2011

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

1 голос
/ 30 сентября 2011

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

comp.lang.c нулевые указатели

0 голосов
/ 30 сентября 2011

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

...