如您所知,在标准的现代 C 语言中,指针上下文中使用的常量 0 值作为一个空指针常量,它被转换为特定于平台(甚至可能是特定于类型)的) 空指针值。
与此同时,C 语言的早期版本,如 C Reference Manual 中描述的那样, 并没有在指针和整数上下文之间做出太多区分,允许人们自由地比较整数并将其分配给指针。如果我没记错的话,在那个版本的 C 中,常量 0 没有特殊的地位,这意味着将常量 0 的值赋给一个指针只会使它指向物理地址 0(就像将 42 的值赋给一个指针一样使其指向物理地址 42)。
在 ANSI C 中,情况发生了显着变化。现在将常量 0 分配给指针会将一些特定于平台的 空指针值 放入该指针。空指针值不需要用物理0值来表示。
那么,在 C 语言的历史上,它是在什么时候从一种变为另一种的呢?考虑到它的特殊地位,K&R C 是否已经包含了常量 0 的空指针的更高级别概念?或者 K&R C 是否仍然保证将整数物理分配给指针,即使是常量 0?
最佳答案
它可以追溯到 几乎 C 语言的开头(如果不是最开头的话)。如果您查看 January 1974 C reference manual 的第 21 页,它或多或少直接在一些示例代码中说明:
/* is pointer null? */
if (p == 0) {
再往回走一点,到ca. 1972-73 PDP-11/20 compiler ,我们发现:
match(tree, table, nreg)
int tree[], table[]; {
extern opdope[], dcalc, notcompat;
int op, d1, d2, t1, t2, p1[], p2[];
char mp[];
if (tree==0)
return(0);
op = *tree;
至少如果我没看错的话,if (tree==0)
行会在尝试取消引用之前检查 tree
是否为非空指针
不幸的是,Dennis says他不能比“1972-73”更确定日期了。
在那之前,C 的历史并不多。尽管如此,似乎确实有一些 0 被视为空指针的历史。在我看来,使用 0 作为空指针是 C 从 Unix“继承”的。 November 1971 1st Edition Unix programmer's manual 中 exec
的条目显示一个值为 0 的指针,表示参数列表结束。根据Dennis' description , 在这一点上“C 还没有到来。”
基于所有这些,我初步得出结论,C 从一开始就将 0 视为空指针,或者至少在这么早的时候,可能不再有任何其他语言版本的记录。
我在追踪有关空指针可能具有非零位的第一点的文档方面几乎没有那么成功。从语言的角度来看,这从未是相关的。我怀疑它很早就发生了,但是很难找到支持它的文档。 C 的最早端口之一是 IBM System/360 mainframes ,虽然我找不到它的直接文档,但我猜测可能是这些机器上使用的空指针值在内部可能不为零。我手边没有确切的数字,但我知道这些机器上的 PL/I 使用了一个非零值来表示它相当于一个空指针;我猜测当他们将 C 移植到这些机器时,他们可能使用相同的值。
关于c - 指针上下文中的常量 0 何时获得其特殊地位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7128819/