浅谈野指针

什么是野指针?

  野指针并不是NULL指针,它是一个指向“垃圾”内存的指针,也就是说指向的地址是随机的,无法得知他的地址,操作系统自动对其进行初始化。
  在计算机中,内存的分配由操作系统来管理,要使用内存需要先向操作系统申请,系统分配后才可以使用,而野指针的内存空间是由系统随机分配的,属于非法访问内存。

野指针有什么危害?

  当一个指针成为了野指针,他的指向就是随机的,当你使用了一个指向随机地址的指针时,他的危害程度也是随机的,不可预测的,它一般会造成内存泄漏,而且很容易遭受到黑客还有病毒的攻击,只要将病毒什么的放入这块内存中就可以,当你使用这个指针的时候就就开始执行病毒或其他程序

什么叫作内存泄漏?

  内存泄漏是由于疏忽或错误造成程序没有及时释放已经不使用的内存情况。内存泄漏并不是物理意义上的内存消失,而是由于程序分配了一段内存后,并不能对这段内存进行控制,造成了内存的浪费。
  简单的说,内存泄漏分为两方面:

  1. 非法访问空间。
  2. 访问已经释放了的空间

怎样产生野指针?

  1. 在创建指针时没有对指针进行初始化。
  2. 在释放了指针后没有将其指向NULL。
  3. 在指针变量的作用域之外使用指针

如何避免野指针?

  1. 养成良好的编码习惯。
  2. 定义指针时,要进行初始化,如果没有确定的值,就让它指向NULL。因为NULL在宏定义是#define NULL (void **) 0 它代表的是零地址,零地址是不能进行任何读写操作的。
  3. 当要给指针指向的空间进行赋值时,要检查有没有给这个指针分配空间。方法如下:
int *p = malloc(sizeof(int));
//这里说明一下为什么赋值的是int整形类型的字节长度,而不是4,因为不同平台上的整形类型的字节长度不相同,
//如果要跨平台使用会带来不必要的麻烦,这要就很好的提高了代码的移植性
if(p == NULL)
{printf("分配失败\n");exit(1);//跳出整个程序,return是跳出一个程序
}
  1. 要将申请好的空间进行初始化操作。因为这段空间可能会存在之前数据的残留,会对程序造成影响。可以用memset(p,0,sizeof(int))将指针指向的空间都置为0。
  2. 使用完指针要及时将指针释放,与malloc所对应的为free(p);
  3. 释放完成后要将指针指向NULL,否则会生成野指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转: Linux下单网卡多vlan多虚拟机

#启动xen服务:xend start#列出虚拟机xm list#startxm create -c 虚拟机名#进入虚拟机xm console 虚拟机名#退出虚拟机ctrl]#关闭xm shutdown linux bridge实现了ieee 802.1d协议,这个实现,不能支持VLAN的功能。也就是说,这个实现&…

谈谈 Android 有多成功!欧盟这么罚它

选自 | Stratechery 作者 | Ben Thompson 编译 | 网易智能 参与 | 乐邦西方知名科技博主本汤普森(Ben Thompson)近日发布题为“欧盟VS Android”的文章,称谷歌固然有其违法的地方,但欧盟剥夺谷歌从其冒着高风险斥资数十亿美元开发…

VSS 错误链接

VSS服务器没有开(或者链接不上、共享断开等情况),vs工程打开会提示你找不到VSS数据库,不小心点错了位置,结果VS链接不上VSS了,老是提示如下错误:VSS出项错误"Could not find the Visual So…

算法的五大特性

输入(Input) 算法可以有0个或多个输入,用来说明对象的初始值,其中的0的输入的意思是指算法自己已经定出了初始条件 输出(Output) 算法中必须有1或多个输出,因为输出是用来说明数据处理后的结果…

《纽约时报》评中国技术热潮:追捧“上菜机器人”等无意义的新奇产品

来源:纽约时报编译:全球技术地图上海的机器人魔力餐厅里的非人类服务员只能做到这一步。在食客们拍完照片和视频后,常规的服务员会上前进行服务。上海——能读人想法的耳机什么都没读出来。检测火灾的机器人已被宣布为安全隐患。机器人服务员…

运算符的优先级(Operator Precedence)总结(表)

概念 在一个表达式中可能包含多个有不同运算符连接起来的、具有不同数据类型的数据对象;由于表达式有多种运算,不同的结合顺序可能得出不同结果甚至出现错误运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合&#xff…

队列 VS 堆栈

队列,又称为伫列(英文queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端&…

10家最具创新性的机器学习公司

来源:资本实验室摘要:机器学习是实现人工智能的一种方法,通过使用算法来解析数据、从中学习,然后对现实世界中的事件做出预测和判断。机器学习已经在各个行业得到广泛应用。近日《Analytics Insight》杂志评选出10家最具创新性的机…

静态数据成员与非静态数据成员

静态数据成员 用static来声明静态成员,它是类的一部分,有该类中的所有对象共同使用和维护,实现类中数据的共享(静态区),要受private控制符影响。 非静态数据成员 类的每个实例都有一份拷贝(动态区)。 从内…

【译】微型ORM:PetaPoco

PetaPoco是一款适用于.Net 和Mono的微小、快速、单文件的微型ORM。 PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中。工作于严格的没有装饰的Poco类,和几乎全部加了特性的Poco类Insert/Delete/Update/Save …

李飞飞公布谷歌云TPU、AutoML、行业方案等多项进展,AI云计算成谷歌全新增长点...

来源:全球人工智能摘要:7 月 24 日-26 日,Google Cloud NEXT 18 大会在美国旧金山举行。7 月 24 日-26 日,Google Cloud NEXT 18 大会在美国旧金山举行,Google Cloud作为谷歌人工智能未来业务发展的基础性平台&#xf…

new/delete和malloc/free的区别

malloc/free和new/delete的区别 共同点 都是从堆上申请空间,并且需要用户手动释放。 不同点 1、malloc/free是函数,new/delete是操作符。 2、malloc需要用户区手动计算空间的大小,new直接再后面跟上空间的类型就好。 3、malloc返回的是…

this的用法添加样式给tr或者div

onmouseover与onmouseout事件处理器,分别对应为鼠标移上去和鼠标移开时触发。οnmοuseοver"this.classNamemenu_title2;" 是鼠标移到该单元格上去时应用的css样式为“.menu_title2”的样式 οnmοuseοut"this.classNamemenu_title;"是鼠标离…

C语言中生成可执行程序的过程

预处理:展开头文件/进行宏替换/去掉注释/条件编译 编译:检查语法是否有错误,生成汇编代码 汇编:将汇编代码转换可供机器识别的机器码 链接:将多个文件链接到一起生成可执行程序

Gartner:2018年十大科技趋势与其对IT和执行的影响

来源:云技术实践摘要:Gartner每年发布的十大战略科技趋势一直备受关注,但企业往往会将50%以上的预算花在基础设施和执行上。因此,了解十大科技趋势与其对IT和执行的影响十分必要。在本周的Gartner CIO峰会期间,Gartner…

C++读取INI文件

Windows操作系统专门为此提供了6个API函数来对配置设置文件进行读、写:GetPrivateProfileInt() 从私有初始化文件获取整型数值GetPrivateProfileString() 从私有初始化文件获取字符串型值GetProfileInt 从win.ini 获取整数值GetProfileString 从win.ini 获取字符串值…

专栏 | 李航教授展望自然语言对话领域:现状与未来

来源:机器之心摘要:原华为诺亚方舟实验室主任、现已加入字节跳动 AI Lab的李航教授近日发表博客,对自然语言对话领域的现状和最新进展进行总结,并展望了未来的走向。1. 引言语音助手、智能客服、智能音箱、聊天机器人,…

浅析智能指针

为什么要有智能指针? 1.什么是智能指针? 智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放…

论强化学习的根本缺陷

来源:AI 科技评论摘要:本文来自斯坦福大学博士生 Andrey Kurenkov 在 The Gradient 上发表的文章。在本文中,我们将讨论人工智能的一个核心领域——强化学习——的局限性。在这个过程中,起初我们将通过一个有趣的例子提出我们要讨…

c语言常用输出格式

在C语言中常用的是靠printf(" 输出的格式",输出的内容); 来进行输出,所以要掌握一些关于输出的格式,下面将用代码的形式来简单说明: char c;char s[20]; int i1234;float f1.234567894567879; double d0.123…