野指针和free总结超有用的资料
在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 <stdio.h>
#include <string.h>
#include <stdlib.h> 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;
}
参考学习资料
指针
http://www.makeru.com.cn/live/1392_238.html?s=45051
C语言控制led灯
http://www.makeru.com.cn/live/1392_304.html?s=45051
输入和输出
http://www.makeru.com.cn/live/1758_312.html?s=45051
C语言玩转链表
http://www.makeru.com.cn/live/1392_338.html?s=45051
野指针和free总结超有用的资料的更多相关文章
- QPointer很大程度上避免了野指针(使用if语句判断即可,类似于dynamic_cast),而且使用非常方便 good
QPointer 如何翻译呢?我不太清楚,保留英文吧. The QPointer class is a template class that provides guarded pointers ...
- linux kernel elv_queue_empty野指针访问内核故障定位与解决
1. 故障描述 故障操作步骤: 单板上插了一个U盘,出问题前正在通过FTP往单板上拷贝文件,拷贝的过程中单板自动重启. 故障现象: Entering kdb (current=0xc000000594 ...
- iOS为真机调试增加scribble来定位野指针
尽管在ARC中,野指针出现的频率已经大大降低了,但是仍然会有野指针困扰着我们. 在模拟器调试中,我们可以开启scribble或者zombieObject来将已经释放的内存填充无意义的内容,能够将一些非 ...
- C++内存泄露之野指针
写出本文仅仅是处于备忘的目的. 最近为现在做的软件添加了一个内存回收机制(以前处于某种内存只申请不释放,这并不等于内存泄露,因为我们知道这些内存块在内存中的位置)-- 在某一块内存不使用的时候将其释放 ...
- iOS开发_内存泄漏、内存溢出和野指针之间的区别
今天,在工作群中,被问到了内存泄漏和野指针指向的区别,自己答的不是很好,特意回来查了资料,在博文中总结一下经验,欢迎指正. 内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自 ...
- NULL指针、零指针、野指针
1.1.空指针 如果 p 是一个指针变量,则 p = 0; p = 0L; p = '\0'; p = 3 - 3; p = 0 * 17;p=(void*)0; 中的任何一种赋值操作之后, p 都成 ...
- Xcode 7 调试野指针利器 Address sanitizer
Xcode 7 调试野指针利器 Address sanitizer 什么是Address Sanitizer? AddressSanitizer is a fast memory error dete ...
- 黑马程序员-nil Nil NULL NSNull 野指针和空指针
空指针1.空指针指不含有任何内存地址的指针.在没有具体初始化之前,其被符值为0Dog * dog = nil;Dog * dog = NULL;都为空指针2.野指针指指向的内存为垃圾内存,导致其值不确 ...
- C中的野指针—如何避免
转自:http://www.cnblogs.com/viviwind/archive/2012/08/14/2638810.html 先看一个例子: struct student{ char* nam ...
随机推荐
- AOP联盟通知类型和Spring编写代理半自动
一.cglib功能更强大 二.Spring核心jar包 三.AOP联盟通知 三.代码实现Spring半自动代理 1.环绕通知的切面 2.bean.xml配置 3.创建bean容器,获取bean,即已经 ...
- python库--pandas--写入文本文件
pandas.DataFrame.to_csv 参数 说明 path_or_buf=None 文件路径或对象, 若果为None, 则结果作为字符串返回 sep=',' 分隔符 na_rep='' 缺失 ...
- RocketMQ详解(二)安装使用详解
专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...
- 在 vue-cli 项目中 使用elementUI 的“自定义主题”功能
1.安装elementUI $ npm i element-ui -S 2.安装主题工具 npm i element-theme -g 3.安装chalk主题 npm 安装 npm i element ...
- 【PHP数据结构】栈和队列的应用
通过栈和队列的学习,我们似乎会感觉到其实数据结构还是非常简单的嘛.当然,这只是一个开始,我们从顺序表.链表开始,到现在的栈和队列,其实都是为了将来在铺路.在树和图的遍历算法中,都可以见到栈和队列的身影 ...
- 如何创建 Office LTSC 2021 VL(批量许可)版本的安装 ISO
Office LTSC 2021 发布 2021 年 9 月 16 日,微软正式发布了支持 Office 2021 的部署工具(Office Deployment Tool),这意味着 Office ...
- Java基础系列(37)- 数组下标越界及小结
数组的四个基本特点 其长度是确定的,数组一旦被创建,它的大小就是不可以改变的 其元素必须是相同类型,不允许出现混合类型 数组中的元素可以是任何数据类型,包括基本类型和引用类型 数组变量属于引用类型,数 ...
- 接口测试checklist
静态测试 接口文档与设计文档对应 接口定义 接口定义与数据库定义 业务功能测试 系统全流程验证 逆向全流程验证 事务性测试 边界值测试 业务规则边界值 场景分析合理长度 场景分析合理数据量 输入.输出 ...
- git pull 时remote: HTTP Basic: Access denied解决方案
当qian windows用户密码过期更改了密码后,操作git pull 拉取远程仓库代码或git push时报错 如下:remote: HTTP Basic: Access denied Auth ...
- 基于PaddleOCR实现AI发票识别的Asp.net Core应用
简要介绍 用户批量上传需要识别的照片,上传成功后,系统会启动Hangfire后台Job开始调用PaddleOCR服务返回结果,这个过程有点类似微服务的架构模型. PaddleOCR PaddleOCR ...