博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三.野指针和free
阅读量:5290 次
发布时间:2019-06-14

本文共 1179 字,大约阅读时间需要 3 分钟。

在C语言项目中,经常会遇到需要程序员手动分配内存的地方。这样做能够节省大量的内存空间,也让程序更加灵活。只要你有一定的基础,那么肯定用过 malloc 或者 ralloc和free的组合。这个组合使用起来有一个需要注意的地方,不知道你有没有发现。

野指针是什么?

根据百度百科的说法,野指针是指 指向一个已删除的对象或未申请访问受限内存区域的指针.

我这里是这样理解的,野指针就是指向的内存区域不合法,这里的不合法主要包括以下几个方面:

1. 所指向的内存未申请

2.所指向的内存被释放

当你访问一个未申请的内存区域时,系统会判定我们没有权限,无法访问。内存被释放后你再访问,结果完全不可预知,很大几率会出现段错误(segmentation fault),这是提示你访问越界了。

野指针怎么出现的?

在代码中以下几种情况会出现野指针:

1.指针声明后未初始化

这种情况下编译器一般会给出一个 warning警告,自己要注意避免。

2.指针指向的空间被free后,没有被重置为NULL,或者指向一个有效的内存区域

在free后要及时处理被free的指针,例如令其指向NULL。

野指针该如何避免?

1.在指针声明时,要养成将其初始化的习惯。如下:

int *p = NULL;

默认将其初始化为NULL

2.在free后面,加上重置指针的代码,如下:

free(p);p = NULL;

重置为NULL

为了便于理解,下面贴上一份代码:

#include 
#include
#include
int main(int argc,char *argv[]){ char *p = NULL; //初始化为NULL p = (char *)malloc(100); if(p==NULL) { return 0; } strcpy(p,"12321323213"); //向内存拷贝值 printf("p : %s\n",p); //打印值 if(p!=NULL) { free(p); p = NULL; //在释放完后,再将指针的值置为空 } //free释放的是指针所指向的内存空间,而不是指针的值。 //所以释放后指针还是指向原来的地址 if(p1!=NULL) { free(p1); //如果再次释放,就会出现野指针错误。 } getchar(); return 0;}

转载于:https://www.cnblogs.com/hanhuo/p/9367146.html

你可能感兴趣的文章
大量界面刷新时手动Dispose也是有必要的
查看>>
机电传动控制第三周学习笔记
查看>>
删除.gitignore中的在version control中的文件
查看>>
java精确计算、精确计算工具类
查看>>
操作系统实验零——操作系统实验环境准备
查看>>
centos服务器搭建javaweb项目步骤
查看>>
Docker入坑指南之EXEC
查看>>
XmlNode和XmlElement(转)
查看>>
python3+ros+telnet+telnetlib
查看>>
head first 设计模式读书笔记 之 策略模式
查看>>
并发数据结构:迷人的原子
查看>>
JS—操作符优先级
查看>>
获取日期的相关方法
查看>>
怎样理解阻塞非阻塞与同步异步的区别?
查看>>
TFS 服务端默认端口更改
查看>>
C#字符串string的常用使用方法
查看>>
3.6.使用STC89C52控制MC20解析GPS的经纬度数据上传到指定服务器
查看>>
Could not load driverClass com.mysql.jdbc.Driver错误
查看>>
路飞学城-爬虫集训营-第一章
查看>>
技术人员应真正学会的第二课程
查看>>