Почему нулевой адрес используется для нулевого указателя?
в 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 для нулевого указателя является абстракцией, другое значения указателя не обязательно. Это приводит меня к публикации другого вопроса переполнения стека,могу ли я когда-нибудь получить доступ к нулевому адресу?.
Comments