5.9为什么空指针问题经常地出现?
C 程序员传统上喜欢知道很多(可能比他们需要知道的还要多) 关于机器实现 的细节。空指针在源码和大多数机器实现中都用零来表示的事实导致了很多无根 据的猜测。而预处理宏(NULL) 的使用又似乎在暗示这个值可能在某个时刻或者 在某种怪异的机器上会改变。“if(p == 0)” 这种结构又很容易被误认为在比较之 前把p 转成了整数类型, 而不是把0 转成了指针类型。最后, 术语“空” 的几种用 法(如上文问题5.10 所列出的) 之间的区别又可能被忽视。
冲出这些迷惘的一个好办法是想象C 使用一个关键字(或许象Pascal 那样, 用“nil”) 作为空指针常数。编译器要么在源代码没有歧义的时候把“nil” 转成适 当类型的空指针, 或者有歧义的时候发出提示。现在事实上, C 语言的空指针常数 关键字不是“nil” 而是“0”, 这在多数情况下都能正常工作, 除了一个未加修饰的 “0” 用在非指针上下文的时候, 编译器把它生成整数0 而不是发出错误信息, 如果 那个未加修饰的0 是应该是空指针常数, 那么生成的程序不行。
冲出这些迷惘的一个好办法是想象C 使用一个关键字(或许象Pascal 那样, 用“nil”) 作为空指针常数。编译器要么在源代码没有歧义的时候把“nil” 转成适 当类型的空指针, 或者有歧义的时候发出提示。现在事实上, C 语言的空指针常数 关键字不是“nil” 而是“0”, 这在多数情况下都能正常工作, 除了一个未加修饰的 “0” 用在非指针上下文的时候, 编译器把它生成整数0 而不是发出错误信息, 如果 那个未加修饰的0 是应该是空指针常数, 那么生成的程序不行。