Почему нулевой адрес используется для нулевого указателя? - PullRequest
117 голосов
/ 03 мая 2010

В C (или C ++ в этом отношении) указатели являются особыми, если они имеют нулевое значение: я советую устанавливать указатели в ноль после освобождения их памяти, потому что это означает, что освобождение указателя снова не опасно; когда я вызываю malloc, он возвращает указатель со значением ноль, если он не может получить мне память; Я все время использую if (p != 0), чтобы убедиться, что переданные указатели действительны и т. Д.

Но поскольку адресация памяти начинается с 0, разве 0 не является таким же допустимым адресом, как любой другой? Как можно использовать 0 для обработки нулевых указателей, если это так? Почему отрицательное число не равно нулю?


Edit:

Куча хороших ответов. Я резюмирую сказанное в ответах, выраженных моим собственным разумом, и надеюсь, что сообщество исправит меня, если я пойму неправильно.

  • Как и все остальное в программировании, это абстракция. Просто константа, не связанная с адресом 0. C ++ 0x подчеркивает это, добавляя ключевое слово nullptr.

  • Это даже не абстракция адреса, это константа, указанная стандартом C, и компилятор может преобразовать ее в какое-то другое число при условии, что он никогда не будет равняться «реальному» адресу и равен другому нулю указатели, если 0 - не лучшее значение для платформы.

  • В случае, если это не абстракция, как это было в первые дни, адрес 0 используется системой и недоступен программисту.

  • Я признаю, что мое отрицательное числовое предложение было немного диким мозговым штурмом. Использование целого числа со знаком для адресов немного расточительно, если оно означает, что кроме нулевого указателя (-1 или чего-либо другого) пространство значений равномерно разделено между положительными целыми числами, которые дают действительные адреса, и отрицательными числами, которые просто напрасны.

  • Если какое-либо число всегда представляется типом данных, то оно равно 0. (Вероятно, 1 тоже. Я думаю об одномразрядном целом числе, которое будет 0 или 1, если оно не подписано, или просто бит со знаком, если подписано, или двухбитовое целое число, которое будет [-2, 1]. Но тогда вы можете просто перейти к 0, равному нулю, и 1, являющемуся единственным доступным байтом в памяти.)

Тем не менее, в моем разуме есть что-то нерешенное. Вопрос переполнения стека Указатель на определенный фиксированный адрес говорит мне, что даже если 0 для нулевого указателя является абстракцией, другие значения указателя не обязательно. Это заставляет меня опубликовать еще один вопрос переполнения стека, Могу ли я когда-нибудь получить доступ к нулевому адресу? .

Ответы [ 21 ]

0 голосов
/ 03 мая 2010

В редких случаях ОС позволяет вам писать по адресу 0. Распространено то, что связано с ОС, в низком объеме памяти; а именно, IDT, таблицы страниц и т. д. (Таблицы должны быть в ОЗУ, и их проще прикрепить внизу, чем пытаться определить, где находится верх ОЗУ.) редактировать системные таблицы волей-неволей.

Возможно, это не было умы K & R, когда они сделали C, но это (наряду с тем фактом, что 0 == нуль довольно легко запомнить) делает 0 популярным выбором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...