0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述C语言中什么是悬空指针和野指针

GReq_mcu168 来源:哔哩哔哩 作者:C语言_编程俱乐部 2021-03-18 11:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

提起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语言比较重要的内容,希望大家在编码的时候一定要注意。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7646

    浏览量

    146113

原文标题:C语言中的“悬空指针”和“野指针”是什么意思?

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C++ 11 14 17 20内存管理-指针、智能指针和内存池基础与提升

    大模型在云端吞吐着海量数据,当自动驾驶汽车在毫秒间做出生死决策,我们不得不重新审视支撑这一切数字大厦的基石——C++内存管理。尽管高级语言层出不穷,但在对性能、延迟和资源控制有着极致要求的底层核心领域,C++依然是无可争议的王者
    的头像 发表于 04-20 15:51 479次阅读

    指针与函数详解

    。 2、函数指针函数指针,本质上他是一个指针,并不是一个函数。在C语言中有些概念是一脉相承的,之前的推文《
    发表于 01-23 06:02

    C语言重点—指针

    C语言是比较偏底层的语言,为什么他比较偏底层,就是因为他的很多操作都是直接针对内存操作的。 这篇我们就来讲解C语言的一大特点,也是难点,
    发表于 01-22 08:23

    函数指针介绍

    就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。 指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。
    发表于 01-21 08:11

    指针难学的4点原因分析

    p时,前面的*号只是告诉编译器,p是个指针,其它没什么用处。我个人一直认为,当初发明C语言时,定义指针p时不应该用*来说明,你可以用@号,用#号,用$号,随便用什么号来说明p是个
    发表于 01-16 06:12

    请教一个C语言指针问题,求解答

    C语言指针,多多少少还是有些难度的,容易有些混淆。 请教大家下面的这个表达式是啥意思呢? short (*p)[size] = (short (*)[size])0x8ff00000; 是否为在0x8ff00000地址处分
    发表于 01-12 08:14

    C语言指针p、*p、&p、*&p、&*p分别代表什么

    C语言中指针是非常重要的概念。指针是一个变量,其值为另一个变量的地址。使用指针可以直接访问内存中的数据,这使得
    发表于 01-07 07:34

    C语言函数指针的六个高级的应用场景

    函数指针是一种非常强大的编程工具,它可以让我们以更加灵活的方式编写程序。在本文中,我们将介绍 6 个函数指针的高级应用场景,并贴出相应的代码案例和解释。 回调函数 回调函数是指在某个事件发生时被
    发表于 01-04 12:25

    C语言回调函数原来这么简单

    ” 这个概念,它是回调函数能够实现的重要基础。 1、函数指针学习过C语言的伙伴都知道,C语言中的灵魂 —
    发表于 12-30 06:45

    Typedef在C语言中的应用

    Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子: #define dPS struct s * typedef
    发表于 12-22 13:53

    C语言中可以嵌套汇编语言吗?

    请问C语言中可以嵌套汇编语言吗?
    发表于 12-15 08:14

    指针的基础

    1. int va; 这是一个整型变量,32位CPU的话,占有32个bite 2. int *va; 这是一个整型指针变量,用于存放一个整型变量的地址 3. int **va; 这是一个整型
    发表于 12-15 06:06

    函数指针指针函数的区别

    在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,和大家的一些总结,整理到此。和大家分享。   首先它们之间的定义:   1、指针函数是指带
    发表于 12-12 06:34

    如何用函数指针调用函数

    (void) { int(*p)(int, int);//定义一个函数指针 int a, b, c; p = Max;//把函数Max赋给指针变量p, 使p指向Max函数 printf(\"
    发表于 12-11 06:26

    C指针的妙用分享

    1、你知道吗?指针其实是个天生的数学家!看这个: #include int main() { int arr[] = {10, 20, 30, 40, 50}; int *p = arr
    发表于 11-17 06:35