Указатель, указывающий на 0x0000, совпадает с указателем, установленным в NULL? Если значение NULL определено на языке Си, то в какое место оно физически переводится? Это так же, как 0x0000. Где я могу найти более подробную информацию об этих понятиях?
12
Ответы:
Дело в том, что большинство ответов здесь не адресованы, по крайней мере, не явно, в том, что нулевой указатель - это значение, которое существует во время выполнения, а константа нулевого указателя - это синтаксическая конструкция, которая существует в исходном коде C.
Константный указатель NULL , так как ответ Карлсона правильно утверждает, либо выражение постоянного целого числа со значением 0 (простым
0
является наиболее распространенным примером), или такого выражения приведения кvoid*
(например(void*)0
).NULL
это макрос, определенный в<stddef.h>
некоторых других стандартных заголовках, который расширяется до определенной в реализации постоянной нулевого указателя . Расширение обычно либо:0
либо((void*)0)
(внешние скобки необходимы для соответствия другим языковым правилам).Таким образом, литерал
0
, когда используется в контексте, который требует выражения типа указателя, всегда оценивается как anull pointer
, то есть уникальное значение указателя, которое указывает на отсутствие объекта. Это не подразумевает ничего о представлении нулевого указателя . Нулевые указатели очень часто представлены как все биты-ноль, но они могут быть представлены как что-либо. Но даже если указатель нулевой представляется в виде0xDEADBEEF
,0
или(void*)0
по - прежнему является постоянным указателем нулевой .Ответ на вопрос о StackOverflow охватывает это хорошо.
Это подразумевает, среди прочего, что
memset()
илиcalloc()
, который может установить область памяти равной нулю, все необязательно будет устанавливать любые указатели в этой области на нулевые указатели. Они, вероятно, делают это в большинстве реализаций, но язык не гарантирует этого.Я не знаю , почему этот вопрос не считается дубликатом этого одного , или , как это актуально здесь.
источник
NULL
или любая константа нулевого указателя объекту указателя устанавливает значение этого объекта в нулевой указатель . На уровне машины это может указывать на некоторый допустимый кусок памяти. Разыменование нулевого указателя имеет неопределенное поведение; доступ к фрагменту памяти по адресу0x0000000
является допустимым поведением, как и буквально все остальное. Этот адрес отличается от любого другого адреса тем, что (а) сравнение равноNULL
и (б) сравнение неравнозначно любому указателю на объект С. Нулевой указатель - это произвольное значение указателя, используемое для указания того, что оно ни на что не указывает.Каждая платформа может определять NULL по своему усмотрению.
В соответствии со стандартом C, если вы присвоите указателю ноль, он будет преобразован в значение NULL (для этой платформы.) Однако, если вы возьмете указатель NULL и приведете его к типу int, нет никаких гарантий, что вы получите ноль на каждой платформе там. Дело в том, что на большинстве платформ он будет нулевым.
Информацию об этом материале вы можете найти в Спецификации языка Си . Один источник, за достоверность которого я не могу поручиться, это: http://www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf
источник
NULL pointer constant
. Насколько я знаю, там нет компиляторов, которые делают это.NULL
макроса, который должен расширяться0
в C ++ и либо0
или(void *)0
в C, потому что это настоящая «константа нулевого указателя».Он определен на языке Си, потому что нет ни одного неизменного машинного адреса, которому он соответствует. Если бы это было так, нам бы не понадобилась абстракция! Несмотря на то, что на большинстве платформ NULL может в конечном итоге быть реализован как 0 того или иного типа, просто неправильно полагать, что это универсально, если вы вообще заботитесь о переносимости.
источник
Согласно разделу « Стандартный документ C »
6.3.2.3
:До сих пор я не видел компилятор, который оторвался от этого.
источник