1、概念
野指针就是指针指向的位置是不可知的、随机的、没有明确限制的。
2、生成的原因
1、指针未初始化
在创建指针变量时未初始化指针变量,会默认为随机值,如:
#include <stdio.h>
int main()
{
int *pr;//创建时未进行初始化
*pr = 1;
return 0;
}
2、指针进行了越界访问
当指针指向的位置超出了所具有的范围,也会成为野指针,如:
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int* pr = &arr[0];
int i = 0;
for (i = 0; i <= 11; i++)
{
*(pr++) = 1;
}
return 0;
}
这个代码运行时便会报一个调试错误的信息,错误如下:
这里的错误原因便是内存的访问越界了。
3、指针指向的空间被释放
当指针指向的空间被直接释放时,这时该指针便会成为悬空指针,也是一种野指针,下次再使用该指针时便可能出现问题,如:
int main()
{
int arr[5] = { 1,2,3,4,5 };
int* pr = &arr[0];
for (int i = 0; i < 5; i++)
{
*(pr++) = i;
}
return 0;
}
3、如何避免
1、在创建指针变量时对指针变量进行初始化
在知道指针指向哪的情况下,直接进行赋值想要指向的地址,在不知道指向哪的情况下,可以给指针赋值NULL,使其成为空指针,避免被读取。
int a = 1;
int*pr1 = &a;//知道地址直接赋值
int*pr2 = NULL;//不知道时赋值NULL
2、避免指针越界访问
代码中创建了哪些空间,指针便只能指向哪些空间,避免访问时超出范围,造成越界访问。
3、不使用指针变量后,对其赋值为NULL,下次使用时判断其安全性
int main()
{
int arr[5] = { 1,2,3,4,5 };
int* pr = &arr[0];
for (int i = 0; i < 5; i++)
{
*(pr++) = i;
}//循环结束后p已经越界了
pr = NULL;//不使用后赋值为NULL
pr = &arr[0];//再次使用时重新进行赋值
if (pr != NULL)// 使用前判断是否安全再使用
{
for (int i = 0; i < 5; i++)
{
*(pr++) = 0;
}
}
return 0;
}
对于上面的代码也可以使用**assert(断言)**进行判断,在使用时需要加上头文件:assert.h
使用方法:assert(pr != NULL);
运行到这个代码时便会进行判断,若pr不等于NULL则程序继续运行,若pr等于NULL程序则会停止,同时报错。