C常见问题解答:
Prime 50 系列使用段 07777,空指针偏移量 0,至少对于 PL/I。后来的模型使用段 0,偏移量 0 表示 C 中的空指针,需要新的指令,例如 TCNP(测试 C 空指针),显然是对所有现有的编写不佳的 C 代码做出错误假设的一种做法。较旧的字寻址 Prime 机器也因需要比字指针 (int *) 更大的字节指针 (char *) 而臭名昭著。
Data General 的 Eclipse MV 系列具有三种体系结构支持的指针格式(字、字节和位指针),其中两种由 C 编译器使用:用于 char * 和 void * 的字节指针,以及用于其他所有内容的字指针。由于历史原因,在 32 位 MV 线从 16 位 Nova 线演变而来的过程中,字指针和字节指针在字的不同位置具有偏移、间接和环保护位。将不匹配的指针格式传递给函数会导致保护错误。最终,MV C 编译器添加了许多兼容性选项来尝试处理存在指针类型不匹配错误的代码。
一些 Honeywell-Bull 大型机将位模式 06000 用于(内部)空指针。
CDC Cyber 180 系列具有 48 位指针,由环、段和偏移量组成。大多数用户(在环 11 中)的空指针为 0xB00000000000。在旧的 CDC 补码机器上,使用全一位字作为各种数据(包括无效地址)的特殊标志是很常见的。
旧的 HP 3000 系列对字节地址使用与字地址不同的寻址方案;像上面的几台机器一样,它因此对 char * 和 void * 指针使用与其他指针不同的表示。
Symbolics Lisp Machine,一种标记架构,甚至没有传统的数字指针;它使用该对(基本上是一个不存在的句柄)作为 C 空指针。
根据使用的“内存模型”,8086 系列处理器(PC 兼容)可以使用 16 位数据指针和 32 位函数指针,反之亦然。
一些 64 位的 Cray 机器在一个字的低 48 位中表示 int *;char * 还使用高 16 位中的一些位来指示字中的字节地址。
附加链接:来自 Chris Torek 的消息,其中包含有关其中一些机器的更多详细信息。