野指针的成因
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。
#include <stdio.h>
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0;
}
我们发现这个代码的指针未初始化,默认地址为随机值,这样就产生了野指针。第一类野指针就是指针为初始化。
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p = arr;
int i = 0;
for(i=0; i<=11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
我们可以看到数组长度为10,而i的范围是[0,11]这里阵阵就越界访问了。
下一类是指针指向的空间释放,这一类是在调用函数的时候。
int* tempor()
{
int a=10;
return &a;
}
int main()
{
int* a=tempor();
*a=20;
return 0;
}
可以总结出有三种野指针:
1. 指针未初始化
2. 指针越界访问
3. 指针指向的空间释放
如何规避野指针
有一些是我们加以小心就可以避免的,比如在指针使用之前检查一下,给指针初始化,如果指针为空给赋值NULL等等。
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放则置为NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
#include <stdio.h>
int main()
{
int *p = NULL;
//....
int a = 10;
p = &a;
if(p != NULL)
{
*p = 20;
}
return 0;
}