В FAQ C есть несколько примеров исторических машин с ненулевыми представлениями NULL.
В: Серьезно, у любых реально используемых машин ненулевой нуль
указатели, или разные представления для указателей на разные
типы?
A: Серия Prime 50 использовала сегмент 07777, смещение 0 для нуля
указатель, по крайней мере, для PL / I. Более поздние модели использовали сегмент 0, смещение 0 для
нулевые указатели в C, требующие новых инструкций, таких как TCNP (Test
C Null Pointer), по-видимому, в качестве сноски к [сноске] всех существующих
плохо написанный код C, который сделал неправильные предположения. Старшая,
Первичные машины с адресацией на слова также были известны тем, что требовали большего
указатели на байты (char *), чем указатели на слова (int *).
В серии Eclipse MV от Data General три архитектурно
поддерживаемые форматы указателей (слово, байт и битовые указатели), два из которых
используются компиляторами C: байтовые указатели для char * и void * и word
указатели для всего остального. По историческим причинам во время
эволюция 32-битной линии MV от 16-битной линии Nova, слово
указатели и байтовые указатели имели смещение, косвенность и кольцо
Защитные биты в разных местах слова. Проходя несоответствие
Формат указателя на функцию привел к сбоям защиты.
В конце концов, компилятор MV C добавил много опций совместимости, чтобы попробовать
иметь дело с кодом, который имел ошибки несоответствия типа указателя.
Некоторые базовые блоки Honeywell-Bull используют битовую комбинацию 06000 для
(внутренние) нулевые указатели.
CDC Cyber 180 Series имеет 48-битные указатели, состоящие из кольца,
сегмент и смещение. Большинство пользователей (в кольце 11) имеют нулевые указатели
0xB00000000000. Это было обычным делом на старых машинах CDC с одним дополнением к
использовать однозначное слово в качестве специального флага для всех видов данных,
включая недействительные адреса.
Старая серия HP 3000 использует другую схему адресации для байта
адреса, чем для слов адреса; как несколько машин выше
поэтому он использует разные представления для char * и void *
указатели, чем для других указателей.
Symbolics Lisp Machine, помеченная архитектура, даже не имеет
обычные числовые указатели; он использует пару (в основном
несуществующий дескриптор) в качестве нулевого указателя C.
В зависимости от используемой «модели памяти», процессоры семейства 8086 (ПК
совместимы) могут использовать 16-битные указатели данных и 32-битные функции
указатели или наоборот.
Некоторые 64-битные машины Cray представляют int * в младших 48 битах
слово; char * дополнительно использует некоторые из старших 16 бит, чтобы указать
адрес байта в слове.