【C语言】几种常见的野指针

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=10return &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;
指针使用之前检查有效性。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值