前排目录:
- 基础定义
- 为何要避免
- 形象理解
- 如何规避
1. 基础定义
首先,其定义为:指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
简单分为三类:指针未初始化
指针越界访问
指针指向空间释放
指针未初始化
#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++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
指针指向空间释放
int* test()
{
int a = 10;
return &a;
//出了局部空间后,a被销毁,对应地址空间
//还给计算机,这个地址可能会被分配给其他程序
//如果再更根据地址调用可能会出问题
//所以这也是个野指针
}
int main()
{
int *p = test();
*p = 20;
return 0;
}
2.为何要避免
野指针,也可以称其为非法指针,强制使用可能会引起不可预测的危害。
上诉提到的三种野指针情况可以统一为:使用了计算机未给我们分配的地址,而该地址有可能已经被分配给了其他程序,强制使用可能会影响两程序正常运行。
3.形象理解
那第三个指针指向空间释放举例:指向空间释放得到野指针的行为好比,你去酒店定了一间24小时的房,酒店(计算机)给你分配了一件房,房号对应的就是指针,在这24小时内(局部函数内)你都可以通过房号找到并使用这间房;第二天你退了房,房间还给了酒店(计算机),结果你还凭借房号(指针)找到并使用了这间房,然而这间房在几分钟前已经分给了另一个客人,你强行闯入就被定义为非法。
4.如何规避
(1. 指针初始化
(2. 小心指针越界
(3. 指针指向空间释放即使置NULL
(4. 避免返回局部变量的地址
(5. 指针使用之前检查有效性
以上,就是我对于野指针的理解,分享给大家,如有错误,欢迎指出!
如果你觉得以上回答对你有所帮助的话,还请点个赞,这将成为我不竭的动力,谢谢你!