C语言中的“悬空指针”和“野指针”是什么意思?
提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大家讲的是指针中的两个特有名词:“悬空指针”和“野指针”。
1 悬空指针
C语言中的指针可以指向一块内存,如果这块内存稍后被操作系统回收(被释放),但是指针仍然指向这块内存,那么,此时该指针就是“悬空指针”。下面这段C语言代码是一个例子,请看:
void *p = malloc(size);
assert(p);
free(p);
// 现在 p 是“悬空指针”
C语言中的“悬空指针”会引发不可预知的错误,而且这种错误一旦发生,很难定位。这是因为在 free(p) 之后,p 指针仍然指向之前分配的内存,如果这块内存暂时可以被程序访问并且不会造成冲突,那么之后使用 p 并不会引发错误。
最难调试的 bug 总是不能轻易复现的 bug,对不?
所以在实际的C语言程序开发中,为了避免出现“悬空指针”引发不可预知的错误,在释放内存之后,常常会将指针 p 赋值为 NULL:
void *p = malloc(size);
assert(p);
free(p);// 避免“悬空指针”p = NULL;
这么做的好处是一旦再次使用被释放的指针 p,就会立刻引发“段错误”,程序员也就能立刻知道应该修改C语言代码了。
2 野指针
上面我们讲的“悬空指针”是指向被释放内存的指针,“野指针”则是不确定其具体指向的指针。“野指针”最常来自于未初始化的指针,例如下面这段C语言代码:
void *p;
// 此时 p 是“野指针”
因为“野指针”可能指向任意内存段,因此它可能会损坏正常的数据,也有可能引发其他未知错误,所以C语言中的“野指针”危害性甚至比“悬空指针”还要严重。在实际的C语言程序开发中,定义指针时,一般都要尽量避免“野指针”的出现(赋初值):
void *p = NULL;
void *data = malloc(size);
这两点内容,是C语言比较重要的内容,希望大家在编码的时候一定要注意。
声明:
本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。
C语言中的“悬空指针”和“野指针”是什么意思?相关推荐
- C语言“悬空指针”和“野指针”究竟是什么意思?
各位,提起C语言我们很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大家讲的是指针中的两个特有名词:"悬空指针"和"野指针&quo ...
- “悬空指针”和“野指针”究竟是什么意思?有什么区别
提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再熬述了,今天我们想跟大家讲的是指针中的两个特有名词:"悬空指针"和"野指针&qu ...
- 什么是“NULL指针”,“悬空指针”和“野指针”?
1,什么是NULL指针? NULL用于指示指针未指向有效位置.理想情况下,如果在声明时不知道指针的值,则应将指针初始化为NULL.另外,当由它指向的内存在程序中间被释放时,我们应该使指针为NULL. ...
- “悬空指针”和“野指针”究竟是什么意思?
关注.星标公众号,不错过精彩内容 素材来源:网络 编辑整理:strongerHuang 提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大 ...
- 【C 语言】指针数据类型 ( 野指针 | 避免野指针推荐方案 )
文章目录 一.野指针 二.避免野指针推荐方案 一.野指针 参考 [C 语言]内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 ) 四. 野指针 ( 程序BUG根源 ...
- 【数据结构】悬空指针和野指针
[数据结构]悬空指针和野指针 一.悬空指针 二.野指针 三.小结 一.悬空指针 在C/C++中,一个指针指向的对象被删除后,该指针变量就变为悬空指针,即指向非法内存,如果所释放的空间被再分配而继续 ...
- C语言特殊指针——const指针、void指针、NULL指针、零指针、野指针
const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性 指向常量的指针: const int *pa; int const *pa; 两者等 ...
- 指针、野指针、指针常量、常量指针
指针 概念 指针是什么? 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值.由于通过地址能找到所需的变量单元,可以说,地址指向该变量 ...
- 一文搞懂指针,指针的指针,悬浮指针,野指针
一文搞懂指针,指针的指针,悬浮指针,野指针 学习C语言过程中,指针的概念往往是重难点,伴随着时隐时显的*,令人头晕.实际上指针并非如此复杂,掌握最基础概念,有利于我们更深刻的理解指针. [百科概念] ...
最新文章
- navicat 导入csv未响应_使用navicat将csv文件导入mysql
- trackr: An AngularJS app with a Java 8 backend – Part IV 实践篇
- 机器学习中样本不平衡处理办法
- 应运而生的web页面响应布局
- sjms-1 面向对象
- Leetcode--面试题 01.07. 旋转矩阵(Java)
- JavaScript从入门到放弃 - ES6中的对象和类
- php中显示不出来,图片显示不出来,但是数据库里有显示
- 微信团队回应“部分用户朋友圈无法刷新”;罗永浩:准备做综艺节目;Apache Spark 3.0 发布| 极客头条...
- webdis实现Redis的http接口及多数据格式共享 [含json,restful]
- chmod命令文件权限属性设置(linux/cygwin)
- 开课吧:现阶段人工智能应用涉及到哪些行业?
- loadrunner11录制无法打开IE浏览器
- excel 使用定位工具批量删除错误值
- 【排序】动画演示10大排序算法
- matlab仿真零中频接收机技术,经典又实用的零中频接收机的技术解决方案
- 微信小程序健康管理系统的开发与实现
- 【rmzt】阳光美女win7主题
- 浅谈限流式保护器在充电线路中电气防火的应用
- 大咖云集 共享国际开源盛宴「第十三届开源中国开源世界高峰论坛」在京成功举办...
热门文章
- JDK 12的Files.mismatch方法
- 为您的Web应用程序启用两因素身份验证
- jpa命名 多条件查询命名_JPA 2 | 动态查询与命名查询
- java内存泄漏案例_寻找内存泄漏:一个案例研究
- gradle maven_Gradle – Maven的观点
- 使用Dagger 2在GWT中进行依赖注入
- sonar java_修复Sonar中常见的Java安全代码冲突
- jsf组件不显示_JSF组件库–质量不只是零缺陷
- jmeter负载测试测试_Apache JMeter:随心所欲进行负载测试
- morphia_Morphia和MongoDB:不断发展的文档结构