6. 野指针

野指针(Wild pointer)是指指针变量所指向的地址是不可用地址或指向非预想地址的指针。

野指针通常是在声明指针变量时没有初始化或指针指向的内存地址已经被释放不再可用而引起的。野指针为程序运行带来不确定性,通常会产生灾难性的后果。

为避免野指针的出现给程序造成破坏。建议在声明指针变量时初始化为空指针,在程序运行中指针指向的内容不再可用时也将指针置空。在使用指针时先判断是否指针为空指针,如果为空则放弃操作,不为空再进行操作。此种做法虽然会多了指针的判断而损失效率,但可以提高程序的安全性和可靠性。

示例:

// file: wild_pointer.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    int * pi1; // pi1 为野指针;
    int * pi2 = NULL;

    for (int i = 0; i < 10; i++) {
        pi2 = &i;
    }

    // 此时 pi2 也为野指针,因为 变量 i 已经不存在,pi2的值已不再有效。
    printf("pi1:%p, pi2: %p\n", pi1, pi2);

    return 0;
}

运行结果:

weimingze@mzstudio:~$ gcc -o wild_pointer wild_pointer.c
weimingze@mzstudio:~$ ./wild_pointer
pi1:0x7ffc1af453a0, pi2: 0x7ffc1af452a4

由运行结果可见指针 pi1pi2 不是空指针,而是不确定的值,因此对此指针解引用可能会出现不可预见的结果。