Решение о том, что происходит при использовании того или иного адреса, довольно сложно. Это зависит от архитектуры процессора, ОС и иногда «того, что делает какое-то программное обеспечение».
У процессора может не быть защиты памяти, или нулевой адрес действительно может быть «использован для чего-то» (в реальном режиме x86, в котором работает DOS, нулевой адрес содержит таблицу векторов, где прерывания и другие переходы, поэтому он невероятно чувствителен к перезаписываются - следовательно, плохо написанные программы могут и могут привести к сбою не только себя, но и всей машины в DOS).
Как правило, современные ОС на процессорах, которые имеют «отображение виртуальной памяти» (поэтому физический адрес, который фактически использует процессор, не совпадает (или может не совпадать) с виртуальным адресом, который видит программа), будут отображать нулевой адрес как «недоступный». "для ваших типичных приложений.
ОС может иногда разрешать доступ к нулевому адресу: много лет назад у меня была ошибка в драйвере Windows, который использовал NULL-указатель, и что в этой конкретной ситуации адрес 0 не вызывал сбоя. Авария произошла намного позже, когда содержимое нулевого адреса использовалось для чего-то - в этот момент система отображала синий экран (по крайней мере, пока я не подключил отладчик и не отладил проблему, а затем исправил ее, чтобы она не пыталась использовать указатель NULL - я не помню, нужно ли было выделить какую-то память или просто пропустил этот бит, если указатель был NULL).
Выбор 0 для NULL основан на комбинации «мы должны выбрать какое-то значение (и нет ни одного значения, которое можно было бы на 100% быть уверенным в том, что никому никогда не понадобится)» - особенно на машинах с 16 или 32 -битовый диапазон адресов. Однако обычно нулевой адрес, если он используется, содержит что-то «особенное» (векторную таблицу для прерываний, код начальной загрузки для процессора и т.п.), так что вы вряд ли будете в нем значимо хранить данные. C и C ++ как языки не требуют, чтобы NULL-указатели были недоступны [но также не «позволяют» вам свободно обращаться к этому местоположению], просто это значение может использоваться как «указатель, который ни на что не указывает. "- и спецификация также предусматривает случай, когда ваше значение NULL НЕ ДЕЙСТВИТЕЛЬНО равно нулю. Но компилятор должен иметь дело с «ZERO означает NULL для указателей, поэтому замените его на X».
Нулевое значение, по крайней мере, иногда, имеет преимущество перед другими значениями - в основном, у многих процессоров есть специальные инструкции для сравнения или определения нуля.
person
Mats Petersson
schedule
20.11.2015
NULL
очень разные, и ваш вопрос, кажется, конкретно основан на том, что вы знаете об указателях C. (Что, кстати, неверно. Хотя почти правильно для C ++.) - person David Schwartz   schedule 20.11.2015