( Пожалуйста, прочитайте этот параграф перед прочтением поста. Я прошу всех, кто заинтересован в прочтении этого поста, постараться прочитать его внимательно, и, конечно, не опускать его до тех пор, пока вы его не поймете полностью, спасибо. )
Теперь это вики сообщества, поэтому если кто-то не согласен с какой-либо из этих концепций, пожалуйста, измените его с четким и подробным объяснением того, что не так и почему, и, если возможно, укажите источники или предоставьте доказательства, которые можно воспроизвести. .
Ответ
Вот несколько других причин, которые могут быть основными факторами для NULL == 0
- Тот факт, что ноль является ложным, так что можно сделать непосредственно
if(!my_ptr)
вместо if(my_ptr==NULL)
.
- Тот факт, что неинициированные глобальные целые по умолчанию инициализируются всеми нулями, и как таковой указатель всех нулей будет считаться неинициализированным.
Здесь я хотел бы сказать слово на другие ответы
Не из-за синтаксического сахара
Сказать, что NULL равен нулю из-за синтаксического сахара, не имеет особого смысла, если так, то почему бы не использовать индекс 0 массива для хранения его длины?
На самом деле C - это язык, который больше всего напоминает внутреннюю реализацию, имеет ли смысл говорить, что C выбрал ноль только из-за синтаксического сахара? Они скорее предоставили бы ключевое слово null (как это делают многие другие языки), чем отображали бы ноль в NULL!
Таким образом, хотя на сегодняшний день это может быть просто синтаксический сахар, ясно, что первоначальное намерение разработчиков языка C не было для синтаксического сахара, как я покажу далее.
1) Спецификация
Тем не менее, хотя верно то, что спецификация C говорит от константы 0 как нулевой указатель (раздел 6.3.2.3), а также определяет NULL для определения реализацией (раздел 7.19 в спецификации C11 и 7.17 в спецификации C99 ), факт остается фактом, что в книге «Язык программирования C», написанной изобретателями языка C, в разделе 5.4 указано следующее:
C гарантирует, что ноль никогда не является действительным адресом для данных, поэтому возвращаемое значение ноль может использоваться для сигнализации о ненормальном событии, в данном случае без пробела.
Указатель и целые числа не являются взаимозаменяемыми, ноль является единственным исключением: постоянный ноль может быть назначен указателю, а указатель может сравниваться с постоянным нулем. Символическая константа NULL часто используется вместо нуля, как мнемоника, чтобы более четко указать, что это специальное значение для указателя. NULL определяется в. В дальнейшем мы будем использовать NULL.
Как можно видеть (из слов "нулевой адрес"), по крайней мере, первоначальное намерение авторов C было с нулевым адресом, а не с постоянным нулем, более того, из этого отрывка следует, что причина спецификации говорит о константе ноль, вероятно, не для исключения выражения, которое оценивается как ноль, а вместо этого, чтобы включить целочисленную константу ноль, чтобы быть единственной целочисленной константой, разрешенной для использования в контексте указателя без приведения.
2) Резюме
Хотя в спецификации явно не говорится, что нулевой адрес может обрабатываться иначе, чем нулевая константа, в нем не говорится, что нет, и тот факт, что при работе с константой нулевого указателя это делает не утверждать, что это реализация, определенная так, как это делает определенная константа NULL , вместо этого заявить, что она равна нулю, показывает, что может быть разница между нулевой константой и нулевым адресом.
(Однако, если это так, мне просто интересно, почему NULL определяется реализацией, поскольку в таком случае NULL также может быть постоянным нулем, поскольку компилятор в любом случае должен преобразовать все нулевые константы в фактическую реализацию, определенную NULL?)
Однако я не вижу этого в реальных действиях, и на общих платформах нулевой адрес и постоянный ноль обрабатываются одинаково и выдают одно и то же сообщение об ошибке.
Более того, фактом является то, что современные операционные системы фактически резервируют всю первую страницу (в диапазоне от 0x0000 до 0xFFFF), просто чтобы предотвратить доступ к нулевому адресу из-за указателя NULL в C (см. http://en.wikipedia.org/wiki/Zero_page,, а также «Windows через C / C ++ Джеффри Рихтера и Кристофа Насарре (опубликовано в Microsoft Press)»).
Таким образом, я хотел бы попросить любого, кто утверждает, что он действительно видел в действии, указать платформу, компилятор и точный код, который он на самом деле сделал (хотя из-за неопределенного определения в спецификации [как я показал) ] любой компилятор и платформа могут делать все, что он захочет).
Однако, по-видимому, кажется, что авторы C не имели этого в виду, и они говорили о «нулевом адресе», и что «C гарантирует, что это никогда не будет действительным адресом», а также «NULL». это просто мнемоника ", ясно показывающая, что его первоначальное намерение не было для" синтаксического сахара ".
Не из-за операционной системы
Также утверждается, что операционная система запрещает доступ к нулевому адресу по нескольким причинам:
1) Когда был написан C, такого ограничения не было, как можно видеть на этой вики-странице http://en.wikipedia.org/wiki/Zero_page.
2) Дело в том, что компиляторы C обращались с нулевым адресом памяти.
Это похоже на факт из следующей статьи BellLabs (http://www.cs.bell -labs.com / who / dmr / primevalC.html )
Два компилятора отличаются в деталях, как они справляются с этим. В более раннем начале можно найти, назвав функцию; в последующем начало просто принимается равным 0. Это указывает на то, что первый компилятор был написан до того, как у нас был компьютер с отображением памяти, поэтому источник программы находился не в месте 0, тогда как ко времени второй у нас был PDP-11, который действительно отображал.
(На самом деле на сегодняшний день (как я цитировал ссылки выше из википедии и прессы Microsoft) причина ограничения доступа к нулевому адресу - из-за указателей NULL в C! Так что в конце это оказывается другим способом вокруг!)
3) Помните, что C также используется для написания операционных систем и даже компиляторов C!
Фактически C был разработан с целью написания операционной системы UNIX вместе с ним, и, как таковая, похоже, нет причин, по которым они должны ограничивать себя с нулевого адреса.
(аппаратное обеспечение) Объяснение того, как компьютеры (физически) могут получить доступ к нулевому адресу
Есть еще один момент, который я хочу здесь объяснить, как вообще можно ссылаться на ноль адреса?
Подумайте на секунду, адреса выбираются процессором, а затем отправляются в виде напряжений на шину памяти, которая затем используется системой памяти для получения фактического адреса, и все же адрес с нулем будет означает отсутствие напряжения, так как физическое оборудование системы памяти обращается к нулевому адресу?
Ответ, как представляется, заключается в том, что нулевой адрес является значением по умолчанию, и другими словами нулевой адрес всегда доступен системе памяти, когда шина памяти полностью отключена, и, как таковой, любой запрос на чтение или запись без указания фактического адрес (как в случае с нулевым адресом) автоматически обращается к нулевому адресу.