目录
野指针的概念
有关野指针的代码
如何规避野指针
野指针的概念
野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
有关野指针的代码
指针未初始化:
#include<stdio.h>
int main()
{
int* p;
*p = 20;
printf("%d\n", *p);
return 0;
}
局部指针变量未初始化,默认为随机值,且程序会报错
指针越界访问:
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int* pa = &arr;
for (int i = 0; i <= sizeof(arr) / sizeof(arr[0]); i++)
{
//当指针指向的范围超出数组arr的范围时,pa就是野指针
*(pa + i) = i;
}
return 0;
}
数组的长度为10,那么数组的下标为0~9,但用指针变量pa来操作数组时超出了数组的范围,这时的pa就是野指针,且程序会报错,直接终止运行
指针指向的空间提前释放:
int* test()
{
int a = 100;
return &a;
}
#include<stdio.h>
int main()
{
int* p = test();
printf("%d\n", *p);
return 0;
}
int类型的变量a的空间是进入test()函数创建,出test()函数时销毁(还给操作系统)
但是在销毁前将a的地址返回给同类型的指针变量p中,p此时存放的就是a的地址
但a已经被销毁了,所以再使用p访问a的空间时就会存在非法访问,此时的p就是野指针
如何规避野指针
1.指针初始化:
能明确知道指针该初始化为谁的地址时,就直接初始化
不知道初始化为什么值时,就赋值为NULL(空指针)
2.小心指针越界
3.指针指向的空间释放后,及时置空(NULL)
4.避免返回局部变量的地址
5.指针使用之前检查有效性