目录
一、野指针
定义:
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。
二、野指针的几种情况
1.非法访问
p未被定义,导致p指向的内存空间地址是随机的,不能向随机地址空间写数据。
int main()
{
int* p; //局部变量指针未初始化,没有明确的指向,为随机值:0xcccccccc
*p=10; //地址所在的空间不是原p的空间
return 0;
}
2.指针越界访问
当指针逐步解引用时,指针指向的范围超出数组的范围,p就是野指针。
Ps:如果指针指向刚好到临界点,但没继续访问就不算越界访问。
#include <stdio.h>
int main()
{
int a[6] = {0};//数组a中的6个元素都为0
int* p = a;//p=a中第一个元素的地址,即p=&a[0]
for(int i = 0;i <= 6;i++)//7次循环,超出范围
{
*p = i;
p++;
}
return 0;
}
3.指针指向的空间释放
在主函数中调用test函数,p指针接收变量a的地址,因a所在的空间是局部的,调用之后a空间释放,代码中的10不属于变量a(但是在没覆盖之前仍然可以通过指针找到对应的值),然而在主函数中p已经被赋予原空间的内容,因此p无法通过此地址去找原来的空间。就好像一栋楼房被拆迁了(空间),但是地图上的地址仍然保持不变(地址不变),当我们通过该地址去找这栋楼是无法实现的。
int* test()
{
int a=10;
return &a;//返回a地址,假设是0x001611f1
}
int main()
{
int* p= test();//调用函数,*p=0x001611f1
printf("%d\n",*p);//局部变量空间释放,无法找回原空间的变量
return 0;
}
三、避免野指针
1.指针初始化
2.小心指针越界
3.指针指向空间释放即时置NULL(“0”)
4.避免返回局部变量的地址
5.指针使用之前检查有效性
#include<stdio.h>
int main()
{
int *p = NULL;//在不确定指针时,将其赋予NULL
int a = 10;
p = &a;
if(p != NULL)//当指针p指向有效空间时才能被赋值
{
*p = 20;
}
return 0;
}
-
使用指针时要多加留意,避免野指针的出现