初始化指针
指针初始化是避免野指针的好方法。初始化很简单,与变量的初始化没有什么不同。
#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));
}