除了一个重要的例外情况,在C语言中将一个整数转换为一个指针,最后得到的结果都取决于具体的C编译器的实现。这个特殊情况就是常数0,编译器保证由0转换而来的指针不等于任何有效的指针。出于代码文档化的考虑,常数0这个值常用一个符号来代替:
#define NULL 0
当然无论是直接用常数0,还是用符号NULL,效果都是相同的。需要记住的重要一点是,当常数0被转换为指针使用时,这个指针绝对不能被解除引用(dereference)。换句话说,当我们将0赋值给一个指针变量时,绝对不能企图使用该指针所指向内存中存储的内容。下面的写法是完全合法的:
if (p == (char *) 0) …
但是如果要写成这样:
if (strcmp(p, (char *) 0) == 0) …
就是非法的了,原因在于库函数srcmp的实现中会包括查看它的指针参数所指向内存中内容的操作。
如果是一个空指针,即使
printf(p);
和
printf(“%s”,p);
的行为也是未定义的。而且,与此类似的语句在不同的计算机上会有不同的效果。
未经允许不得转载:TacuLee » C陷阱与缺陷之空指针并非空字符串