野指针
概念︰野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
需要注意的是,野指针不是NULL指针,通常NULL指针可以使用if语句来判断,但是C语言中没有任何方法用来判断一个指针是否为野指针!
野指针成因
1.指针未初始化
int* p; //p是一个局部的指针变量,局部变量不初始化的话,默认是随机值
*p = 20; //非法访问内存了
2.指针越界访问
int arr[10] = {0};
int *p = arr;
int i = 0;
for(i=0; i<=10; i++) //当指针指向的范围超出数组arr的范围时,p就是野指针
{
*p = i;
p++;
}
3.指针指向的空间释放
int* test ()
{
int a = 10;
return &a ; //返回局部变量a的地址
}
int main ()
{
int*p = test (); //指针接收返回的地址,
*p =20; //在函数结束时已将内存空间还给操作系统,此时想要对该空间进行操作,就是非法访问了
return 0;
}
4.进行了错误的强制类型转换
int main()
{
int a = 1;
int p = &a;
printf("%d\n",*((int*)p));
/*
在64位下输出错误
32位下输出a的值 1
*/
return 0;
}
上面的程序在64位下输出错误,32位下输出a的值1,在我们写嵌入式程序的时候,会将int类型的一个数据强制转换成一个指针类型用来表示寄存器的地址,这个时候就需要注意了。
如何规避野指针
1.指针初始化
2.小心指针越界(c语言本身是不会检查数据的越界行为的)
3.指针指向空间释放及时置NULL
4.指针使用之前检查有效性(0地址不属于用户地址)
if(p != NULL)
{
*p = 10;
}