История изменений
Исправление tailgunner, (текущая версия) :
То есть так делать нельзя потому, что стандарт C явно запрещает нулевому указателю указывать на какой-нибудь валидный объект?
То есть литерал 0 преобразуется в невалидное значение адреса (при этом побитовое представление указателя, получающегося из преобразования, может отличаться от «все 0»). Поэтому утверждение «с точки зрения конкретной платформы, (0) может быть валидным адресом» неверно; утверждение же «нам нужна проверка (ptr == 0) которая проверяет именно значение, без какого-либо дополнительного смысла» - вообще какая-то бессмыслица.
стандарт C явно запрещает нулевому указателю указывать на какой-нибудь валидный объект?
«Нулевой указатель» - это жаргон для невалидного указателя, в который преобразуется целый литерал 0. Во всех известных мне случаях это дает битовое значение указателя «все 0» (отсюда и «нулевой указатель»), но такое значение не гарантируется. А невалидный указатель, конечно, не может указывать ни на какой валидный объект.
если надо писать/читать/вызывать_функцию по нулевому адресу, то правильное решение - писать такие куски на ассемблере?
Если надо читать адреса памяти, которые не являются (могут не являться) адресами валидных Си-объектов (таблицы прерываний, MMIO, потенциально невалидные адреса юзерспейса) нужно либо пользоваться ассемблером, либо полагаться на поведение компилятора, выходящее за пределы стандарта Си.
Исходная версия tailgunner, :
То есть так делать нельзя потому, что стандарт C явно запрещает нулевому указателю указывать на какой-нибудь валидный объект?
То есть литерал 0 преобразуется в невалидное значение адреса (при этом побитовое представление указателя, получающегося из преобразования, может отличаться от «все 0»). Поэтому утверждение «с точки зрения конкретной платформы, (0) может быть валидным адресом» неверно; утверждение же «нам нужна проверка (ptr == 0) которая проверяет именно значение, без какого-либо дополнительного смысла» - вообще какая-то бессмыслица.
стандарт C явно запрещает нулевому указателю указывать на какой-нибудь валидный объект?
«Нулевой указатель» - это жаргон для невалидного указателя, в который преобразуется целый литерал 0. Во всех известных мне случаях это дает битовое значение указателя «все 0» (отсюда и «нулевой указатель»), но это не гарантируется. А невалидный указатель, конечно, не может указывать ни на какой валидный объект.
если надо писать/читать/вызывать_функцию по нулевому адресу, то правильное решение - писать такие куски на ассемблере?
Если надо читать адреса памяти, которые не являются (могут не являться) адресами валидных Си-объектов (таблицы прерываний, MMIO, потенциально невалидные адреса юзерспейса) нужно либо пользоваться ассемблером, либо полагаться на поведение компилятора, выходящее за пределы стандарта Си.