5. 空指针

空指针(Null pointer)是指内存指向 零地址 的指针,即指针的值为 0

在 C 语言中,指针是非常灵活和高效的一种数据类型,它允许我们通过指针保存的地址来直接操作一段内存。但由于过分的灵活也给不熟悉或不能完全掌控指针的软件开发者带来不必要的困惑。因此为了避免不必要的麻烦。建议将没有使用的指针或已经用过但不再使用的指针的值设置为 零值,即空指针

一般来说,计算机的内存零地址都不会存放任何的数据,如果一个指针指向零地址,在解引用对其修改时一般不会造成任何的破坏,甚至有些系统会通过异常的方式来阻止内存的访问,进而保证了程序和数据的安全。

将一个指针置空的写法1

int * p = 0;

上述写法中,由于 pint* 类型, 而字面值 0int 类型,因此有些编译器可能会报告警告或者错误。因此可以改写如下:

int * p = ((void*)0);

上述写法中,由于 pint* 类型, ((void*)0) 是将0转为 指针类型,这样写就不会报告任何警告和错误了。

在大多数系统中,为了简化上述写法,通常在头文件 stddef.h 中使用宏 NULL 来代替 ((void*)0),写起来更直观,可读写更好。

改写后声明空指针的示例如下:

// filename: null_pointer.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    int *p = NULL;
    char * pch;
    pch = NULL;

    printf("p:%p, pch:%p\n", p, pch);

    return 0;
}

运行结果如下:

weimingze@mzstudio:~$ gcc -o null_pointer null_pointer.c
weimingze@mzstudio:~$ ./null_pointer
p:(nil), pch:(nil)

注意: 在 gcc 编译器中会将 空指针显示为 (nil),而非 NULL