В C отсрочка нулевого указателя имеет значение Undefined Behavior, но значение нулевого указателя имеет двоичное представление, которое в некоторых архитектурах указывает на действительный адрес (например, адрес 0).
Позвольте называть этот адрес нулевым адресом указателя для ясности.
Предположим, что я хочу написать часть программного обеспечения на C, в среде с неограниченным доступом к памяти. Предположим далее, я хочу написать некоторые данные по адресу нулевого указателя: , как бы я мог добиться этого стандартным образом?
Пример case (IA32e):
#include <stdint.h>
int main()
{
uintptr_t zero = 0;
char* p = (char*)zero;
return *p;
}
Этот код при компиляции с gcc с -O3 для IA32e преобразуется в
movzx eax, BYTE PTR [0]
ud2
из-за UB (0 - битное представление нулевого указателя).
Так как C близко к программированию на низком уровне, я считаю, что должен быть способ доступа к адресу нулевого указателя и избежать UB.
Просто чтобы быть понятным
Я спрашиваю о том, что стандарт должен сказать об этом, НЕ, как добиться этого в определенной реализации.
Я знаю ответ для последнего.