Author:MTingle
人工智能专业
荃者所以在鱼,得鱼而忘荃;蹄者所以在兔,得兔而忘蹄;言者所以在意,得意而忘 言。吾安得夫忘言之人而与之言哉!
【C语言】常见野指针成因及其规避方法
野指针概念
概念:野指针就是指针指向的位置是不可知的,随机的,不正确的,没有明确限制的。
一、野指针成因
1.指针未初始化
#include<stdio.h>
int main()
{
int *p;//指针未初始化,默认为随机值
*p=20;
return 0;
}
2.指针越界访问
#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;
}
3.指针指向的内存空间释放
int* test()
{
int a=10;
return &a;
}
int main()
{
int *p=test(); //a变量放了一个10;他是一个局部变量,当出去test这个函数时,
//a变量则被销毁,a占据的内存会还给操作系统,通过return将返回的地址给p;
//但是此时空间已还给系统,于是p所指向的空间就会在已经还给系统的位置
*p=20;
return 0;
}
//对于第三类,我们举个粗俗的例子,你晚上在酒店定了一个房间并入住,你与你朋友相约明天下午2点钟于该房间碰面,但是到了第二天11点,你计划有变,选择了退房,可你却没告诉你的朋友,于是你朋友在下午两点闯了进去这个房间,这就属于非法入侵了,此时你的朋友就相当于这里的野指针。
二、如何规避野指针
1.指针初始化
#include<stdio.h>
int main()
{
int a;
int* p=&a;//
*p=20;
return 0;
}
2.小心指针越界
3.指针指向的空间释放,要把指针置为NULL
#include<stdio.h>
int main()
{
int a=10;
int *pa=&a;
*pa=20;
//如不使用指针pa,则将其置为NULL(空)
pa=NULL;
if(pa!=NULL)
{
//若指针不为空,则执行该代码块
}
return 0;
}
4.指针使用之前检查有效性
使用指针前检查指针是否置为空指针(NULL)
#include<stdio.h>
int main()
{
int *p=NULL;
int a=10;
p=&a;
if(p!=NULL)//使用前检查是否为空指针
{
*p=20;
}
return 0;
}
总结
1.成因 :
指针未初始化;
指针越界访问;
指针指向的内存空间释放。
2.规避方法:
指针初始化;
小心指针越界;
指针指向的空间释放,要把指针置为NULL;
指针使用之前检查有效性。