野指针
野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
野指针的成因
- 指针未初始化
#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++)
{
*(p++) = i;
}
return 0;
}
当指针指向的范围超出数组arr的范围时,p就是野指针
- 指针指向的空间释放(不具体展开)
解释:当你用指针指向一块空间后,这块空间在程序中中途释放了,而你指向这块空间的指针他还是指向这块空间,其地址没变,只不过说指针指向的这块空间它由原有确定的值变成不确定了,指针也变成了一个悬垂指针。
这个现象在函数调用时会发生,例如:
#include <stdio.h>
int* test()
{
int a = 10;
return &a;
}
int main()
{
int *p = test();
printf("%d\n", *p);
return 0;
}
这里a的值在函数调用完后就被释放了,也就是说指针变量p最后指向a的那块空间是一个不确定的值。
如何规避野指针
- 指针初始化
- 小心指针越界
- 针指向空间释放,及时置NULL
- 避免返回局部变量的地址
- 指针使用之前检查有效性