一、野指针
野指针概念:指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。
1.指针未初始化:
#include <stdio.h>
int main
{
int* p;
* p = 1;
return 0;
}
2.指针越界访问:
#include <stdio.h>
int main
{
int a[10] = {0};
int* p = &a[0];
int i = 0;
for (i = 0;i < 20;i++)//当指针指向的范围超出数组a的范围时,p就是野指针
{
*(p++) = i;
}
return 0;
}
3.指针指向的空间释放:
#include <stdio.h>
int* test()
{
int n = 100;
return &n;
}
int main()
{
int*p = test();
printf("%d\n", *p);
return 0;
}
二、如何规避野指针
1.指针初始化:
当我们知道指针指向哪里时,可以直接赋值地址;如果不知道指针指向哪里的话,可以给指针赋值NULL,NULL是一个标识符常量,值为0,而0也是地址,但这种地址直接使用是不行的,会报错。
初始化如下:
#include <stdio.h>
int main
{
int a=1;
int* p1=&a;//知道指针指向哪里时
int* p2=NULL;//不知道指针指向哪里时
return 0;
}
2.小心指针越界:
我们可以在每次写代码时注意指针所指向的空间,只要保证它不超出访问范围就不会出现越界的情况。
3.避免返回局部变量的地址:
从前面第三个例子我们可以知道,不返回局部变量的地址就可以规避野指针。
4.指针变量不再使用时,可以用NULL使其不再被访问:
在后期我们不再使用某一指针的时候,可以把指针置为NULL,这样不仅可以避免野指针,而且可以在使用指针之前判断指针是否为NULL。比如:
int main()
{
int arr[10] = {1,2,3,4,5,67,7,8,9,10};
int *p = &arr[0];
for(i=0; i<10; i++)
{
*(p++) = i;
}
//此时p已经越界了,可以把p置为NULL
p = NULL;
//下次使⽤的时候,判断p不为NULL的时候再使⽤
//...
p = &arr[0];//重新让p获得地址
if(p != NULL) //判断
{
//...
}
return 0;
}