【C语言】野指针

前言:在学习C语言或者开放工程时,我们常会听到“野指针”这个概念,那么什么是野指针?野指针产生的原因是什么?野指针的危害是什么?我们又要如何去规避野指针呢?这章内容我们就将学习以上内容。


一,什么是野指针?

野指针是指向位置随机的(乱指一气),错误的指针,系统无法对其进行操作。野指针指向的值是非法的内存地址,指向的内存是不可用的。

二、野指针产生的原因(C语言中常见)

1.局部指针变量没有初始化

我们如果没有手动去初始化全局变量,全局变量会自动初始化为0,而局部变量不会。所以如果我们不将局部指针变量手动初始化为NULL,那么这个局部指针将会是一个野指针,指向一块非法内存地址,系统无法对其进行操作。

2.使用已经释放过的指针

这个错误常见于动态开辟的内存空间,我们使用malloc等动态内存函数后,都要用free函数对其开辟的动态内存空间进行释放,并将其置为空指针,如果我们用了free函数把那块动态内存空间释放了(还给操作系统了),但是还没置将指针变量为空指针就去使用该指针,就会造成非法访问内存。

3.指针指向的变量在使用之前就被销毁了

最常见于“返回栈空间地址”这一问题,在函数中,如果我们返回局部变量指针,就会造成问题,因为函数调用结束后,局部变量就会被销毁。

三,野指针的危害

1.指向不可访问的内存地址->引发段错误;
2.指向一个可用的,但是没有明确意义的空间,程序可以运行,但是实际上程序是有问题的,如果我们对野指针进行了解引用,对其所指向的内存地址作了非法修改,但是这块空间实际上在正在被使用,这个时候里面的正确内容就会被改变,导致程序奔溃,或数据损坏

四,如何规避野指针

1.定义创建一个指针变量时一定要记得初始化
2.动态开辟的内存空间,free()释放内存后,一定要马上将对应的指针置为NULL空指针
3.不用再函数中返回栈空间的指针(地址)或局部变量的地址
4.注意在动态开辟内存后,对其返回值做合理判断,判断其是否为空指针

五,面试题

找出下题的错误:

int* f2(void)
{
    int* ptr;
    *ptr=10;
    return ptr;
}

注意这个代码是错误,它没有把ptr初始化置为空指针,那么此时ptr是个野指针,不能对野指针进行解引用操作。

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_麦子熟了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值