一、形成野指针的原因
1.定义的指针未初始化
int main()
{
int *p;//p在未指向a的地址之前,是野指针。
//可以初始化为int *p = NULL;
int a;
*p = &a;
}
2.指针的越界访问
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i <= 12; i++)
{
*(p++) = i;
}
return 0;
}
当i=10以后,指针P所指向已经超出了数组的范围,这时的P就是野指针。
3.指针指向的空间释放
int* test()
{
int a = 20; //临时变量,在main函数中调用完后会销毁
return &a;
}
int main()
{
int* p = test();
printf("%d\n", *p); //此时的指针P指向的a的地址可能已经被销毁,也可能被系统赋予了新的值。
return 0;
}
二、如何避免野指针
1、指针初始化
如果有确切的值就给它初始化为相应的值,如果没有,则初始化为NULL
2、小心指针越界
多注意数组这类型的。
3、指针指向空间释放,则立马将其置为空指针(NULL)
4、避免返回局部变量的地址
5、指针使用之前检查其有效性
在使用前判断指针是否为空指针(NULL),因为空指针它不指向任何对象。