prev up next   top/contents search

comp.lang.c FAQ 列表· 第 5.2 题

如何在我的程序中获取一个空指针?


使用一个 空指针常量

根据语言定义,在指针上下文中,“值为 0 的整型常量表达式”会在编译时转换为一个空指针。也就是说,在初始化、赋值或比较时,如果一侧是类型为指针的变量或表达式,编译器就能知道另一侧的常量0要求的是一个空指针,并生成正确类型的空指针值。因此,以下代码片段是完全合法的

	char *p = 0;
	if(p != 0)
(另请参见问题 5.3。)

然而,传递给函数的参数不一定能被识别为指针上下文,编译器可能无法知道一个裸露的0“表示”是空指针。为了在函数调用上下文中生成空指针,可能需要一个显式的转换,以强制0被识别为指针。例如,Unix 系统调用execl接受一个可变长度、以空指针结尾的字符指针参数列表,调用方式如下

	execl("/bin/sh", "sh", "-c", "date", (char *)0);
如果最后一个参数上的(void *)转换被省略了,编译器将不知道传递一个空指针,而是会传递一个整型0值。(请注意,许多 Unix 手册都错误地给出了这个例子;另请参见问题 5.11。)

当函数原型在作用域内时,参数传递成为一个“赋值上下文”,并且大多数转换都可以安全地省略,因为原型告诉编译器需要一个指针,以及其类型,从而使编译器能够正确地将一个裸露的0转换为指针。然而,函数原型无法为可变参数列表中的可变参数提供类型,因此对于这些参数仍然需要显式的转换。(另请参见问题 15.3。)为了防止变长参数函数或没有原型的函数,最好在函数调用中正确地转换所有空指针常量。

以下总结了空指针常量何时可以单独使用,何时需要显式转换的规则

[此处放置表格]

参考:K&R1 第 A7.7 节 第 190 页,第 A7.14 节 第 192 页
K&R2 第 A7.10 节 第 207 页,第 A7.17 节 第 209 页
ISO 第 6.2.2.3 节
H&S 第 4.6.3 节 第 95 页,第 6.2.7 节 第 171 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管