初始化指针

指针初始化是避免野指针的好方法。初始化很简单,与变量的初始化没有什么不同。

#include <stddef.h>

int main()
{
    int *p1 = NULL; 
    char *p2 = NULL;
    float *p3 = NULL;

         /* NULL is a macro defined in stddef.h, stdio.h, stdlib.h, and string.h */

    ...
}    

在大多数操作系统中,无意中使用已初始化为 NULL 的指针通常会导致程序立即崩溃,从而可以轻松识别问题的原因。使用未初始化的指针通常会导致难以诊断的错误。

警告:

取消引用 NULL 指针的结果是未定义的,因此即使这是运行程序的操作系统的自然行为,也不一定会导致崩溃。编译器优化可能会掩盖崩溃,导致崩溃发生在源代码中发生空指针解除引用的点之前或之后,或导致包含空指针解除引用的代码部分意外地从程序中删除。调试版本通常不会表现出这些行为,但语言标准无法保证这一点。还允许其他意外和/或不期望的行为。

因为 NULL 从不指向变量,分配的内存或函数,所以可以安全地用作保护值。

警告:

通常 NULL 定义为 (void *)0。但这并不意味着分配的内存地址是 0x0。有关更多说明,请参阅 C-faq 以获取 NULL 指针

请注意,你还可以初始化指针以包含 NULL 以外的值。

int i1;

int main()
{
   int *p1 = &i1;
   const char *p2 = "A constant string to point to";
   float *p3 = malloc(10 * sizeof(float));
}