空指针不指向任何对象,使用它除了赋值或比较外都是非法的。例如,使用空指针进行strcmp操作会导致未定义行为,不同编译器结果可能不同。
- 某些编译器对内存地址0有硬件级的读保护,使用空指针会导致程序立即终止。
- 有些编译器允许读但不允许写内存地址0,空指针看似指向字符串,但内容可能是无意义的“垃圾信息”。
- 还有些编译器允许读写内存地址0,错误使用空指针可能导致覆盖操作系统内容,造成严重问题。
在所有C程序中,错误使用空指针都是未定义的,但可能在某些编译器上“看似”能工作,直到换到另一台机器上才会出现问题。
检查这类问题的一个方法是将程序移到不允许读取内存地址0的机器上运行。以下是一个示例程序,用于检测C语言实现如何处理内存地址0:
#include <stdio.h>
int main() {
char *p = NULL;
printf("Location 0 contains %d\n", *p);
return 0;
}
在禁止读取内存地址0的机器上,这个程序会失败。在其他机器上,它将打印出内存位置0中存储的字符内容。