c - 指针上下文中的常量 0 何时获得其特殊地位?

标签 c history

如您所知,在标准的现代 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 manualexec 的条目显示一个值为 0 的指针,表示参数列表结束。根据Dennis' description , 在这一点上“C 还没有到来。”

基于所有这些,我初步得出结论,C 从一开始就将 0 视为空指针,或者至少在这么早的时候,可能不再有任何其他语言版本的记录。

我在追踪有关空指针可能具有非零位的第一点的文档方面几乎没有那么成功。从语言的角度来看,这从未是相关的。我怀疑它很早就发生了,但是很难找到支持它的文档。 C 的最早端口之一是 IBM System/360 mainframes ,虽然我找不到它的直接文档,但我猜测可能是这些机器上使用的空指针值在内部可能不为零。我手边没有确切的数字,但我知道这些机器上的 PL/I 使用了一个非零值来表示它相当于一个空指针;我猜测当他们将 C 移植到这些机器时,他们可能使用相同的值。

关于c - 指针上下文中的常量 0 何时获得其特殊地位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7128819/

相关文章:

c++ - MEX 中 Matlab 和 C++ 之间的内存共享

c++ - 如何使用 C/C++ 设置系统时间?

javascript - React-router - 通过 history.push() 导航刷新页面

xcode - 如何在我的 Xcode 项目中查看整个 SCM 历史记录?

javascript - 为什么 javascript 程序以纯文本形式交付?

multithreading - “Steam Method” THE'-Multiprogramming System”中的 “Structure of ' Dijkstra是什么意思?

c++ - 为什么尽管使用了 -isystem,但 clang 在我的标题上报告了警告,而 gcc 没有报告?

c - 分配作为条件

在c中创建n个链表

coldfusion - 为什么 ColdFusion 的设计者决定从 1 而不是 0 索引数组?