提起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语言中的“悬空指针”和“野指针”是什么意思?相关推荐

  1. C语言“悬空指针”和“野指针”究竟是什么意思?

    各位,提起C语言我们很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大家讲的是指针中的两个特有名词:"悬空指针"和"野指针&quo ...

  2. “悬空指针”和“野指针”究竟是什么意思?有什么区别

    提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再熬述了,今天我们想跟大家讲的是指针中的两个特有名词:"悬空指针"和"野指针&qu ...

  3. 什么是“NULL指针”,“悬空指针”和“野指针”?

    1,什么是NULL指针? NULL用于指示指针未指向有效位置.理想情况下,如果在声明时不知道指针的值,则应将指针初始化为NULL.另外,当由它指向的内存在程序中间被释放时,我们应该使指针为NULL. ...

  4. “悬空指针”和“野指针”究竟是什么意思?

    关注.星标公众号,不错过精彩内容 素材来源:网络 编辑整理:strongerHuang 提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我们想跟大 ...

  5. 【C 语言】指针数据类型 ( 野指针 | 避免野指针推荐方案 )

    文章目录 一.野指针 二.避免野指针推荐方案 一.野指针 参考 [C 语言]内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 ) 四. 野指针 ( 程序BUG根源 ...

  6. 【数据结构】悬空指针和野指针

    [数据结构]悬空指针和野指针 一.悬空指针 二.野指针 三.小结 一.悬空指针   在C/C++中,一个指针指向的对象被删除后,该指针变量就变为悬空指针,即指向非法内存,如果所释放的空间被再分配而继续 ...

  7. C语言特殊指针——const指针、void指针、NULL指针、零指针、野指针

    const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性 指向常量的指针: const int *pa; int const *pa; 两者等 ...

  8. 指针、野指针、指针常量、常量指针

    指针 概念 指针是什么? 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值.由于通过地址能找到所需的变量单元,可以说,地址指向该变量 ...

  9. 一文搞懂指针,指针的指针,悬浮指针,野指针

    一文搞懂指针,指针的指针,悬浮指针,野指针 学习C语言过程中,指针的概念往往是重难点,伴随着时隐时显的*,令人头晕.实际上指针并非如此复杂,掌握最基础概念,有利于我们更深刻的理解指针. [百科概念] ...

最新文章

  1. navicat 导入csv未响应_使用navicat将csv文件导入mysql
  2. trackr: An AngularJS app with a Java 8 backend – Part IV 实践篇
  3. 机器学习中样本不平衡处理办法
  4. 应运而生的web页面响应布局
  5. sjms-1 面向对象
  6. Leetcode--面试题 01.07. 旋转矩阵(Java)
  7. JavaScript从入门到放弃 - ES6中的对象和类
  8. php中显示不出来,图片显示不出来,但是数据库里有显示
  9. 微信团队回应“部分用户朋友圈无法刷新”;罗永浩:准备做综艺节目;Apache Spark 3.0 发布| 极客头条...
  10. webdis实现Redis的http接口及多数据格式共享 [含json,restful]
  11. chmod命令文件权限属性设置(linux/cygwin)
  12. 开课吧:现阶段人工智能应用涉及到哪些行业?
  13. loadrunner11录制无法打开IE浏览器
  14. excel 使用定位工具批量删除错误值
  15. 【排序】动画演示10大排序算法
  16. matlab仿真零中频接收机技术,经典又实用的零中频接收机的技术解决方案
  17. 微信小程序健康管理系统的开发与实现
  18. 【rmzt】阳光美女win7主题
  19. 浅谈限流式保护器在充电线路中电气防火的应用
  20. 大咖云集 共享国际开源盛宴「第十三届开源中国开源世界高峰论坛」在京成功举办...

热门文章

  1. JDK 12的Files.mismatch方法
  2. 为您的Web应用程序启用两因素身份验证
  3. jpa命名 多条件查询命名_JPA 2 | 动态查询与命名查询
  4. java内存泄漏案例_寻找内存泄漏:一个案例研究
  5. gradle maven_Gradle – Maven的观点
  6. 使用Dagger 2在GWT中进行依赖注入
  7. sonar java_修复Sonar中常见的Java安全代码冲突
  8. jsf组件不显示_JSF组件库–质量不只是零缺陷
  9. jmeter负载测试测试_Apache JMeter:随心所欲进行负载测试
  10. morphia_Morphia和MongoDB:不断发展的文档结构