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

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

3天内不再提示

指针被释放后就变成了空指针吗

学益得智能硬件 来源:学益得智能硬件 2025-01-22 09:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

指针被释放后,是不是就变成了空指针?有好多同学提出了这样的问题。

借用《C专家编程》上面的一段代码,可以很好的解释这个问题。

#include 


int main()
{
    char *s = (char *)malloc(128);


    strcpy(s, "helloworld");


free(s);


    if (s != NULL)
        strcpy(s, "12345");


    return 0;
}

这段代码大家看下有没有问题,能不能顺利运行?

前面三行都没有问题,指针 s 指向了一块堆内存,把字符串 helloworld 拷贝到堆内存中,然后释放了 s。

问题就出在这,很多同学不理解,指针 s 被释放了,是不是就变成了空指针?

如果变成了空指针,那下面的判断就不会成立,也就不会执行拷贝操作。

其实这样的理解是有问题的。

指针 s 指向了堆内存,free(s) 准确的讲,是把 s 指向的内存释放掉,这个操作对 s 本身并没有影响,s 里面保存的还是原来那块内存的地址,并不是空。

所以下面的判断语句成立,继续执行拷贝操作。

由于 s 指向的内存已经被释放掉,强行往里面拷贝,就会出现意想不到的错误。

养成良好的编程习惯就是指针被释放掉后,手动把它变成空,空指针比野指针、悬空指针更可控。

指针是C语言的精髓,如果你还是觉得模棱两可,不妨看下这套播放量近 20 万的指针教程,课程以及资料全部开源,看完后一定会让你的指针水平达到一个更高的级别。

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

    关注

    1

    文章

    484

    浏览量

    71949
  • 代码
    +关注

    关注

    30

    文章

    4975

    浏览量

    74349

原文标题:指针被释放后,是不是变成了空指针

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    传递一个无符号的 long 型指针给函数

    C语言允许传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值: 实例 #include #include
    发表于 01-27 11:51

    指针与函数详解

    函数的最大区别是函数指针的函数名是一个指针,即函数名前面有一个指针类型的标志型号“*”。 注意指针函数与函数指针表示方法的不同,千万不要混淆
    发表于 01-23 06:02

    C语言重点—指针

    个字节大小),在让变量指向这篇空间,即就是这片空间属于这个变量,再在这片空间中存储你要存储的数值。 三. 指针类型(int *)的存储过程和原理3.1 指针类型的赋值规范(1) 第一种先定义赋值
    发表于 01-22 08:23

    函数指针介绍

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

    值传递、指针传递、引用传递介绍

    进行操作,也就是说,即使形参的值发生改变,实参的值也完全不受影响。   2、指针传递:指针传递其实是值传递的一种,它传递的是地址。值传递过程中,调函数的形参作为调函数的局部变量来处
    发表于 01-21 06:48

    函数指针与回调函数解读

    是,在程序执行期间可以动态更改调用的回调函数。 一、函数指针函数指针,顾名思义它就是一个指针,只不过它是一个函数指针,所以指向的是一个函数
    发表于 01-19 07:34

    指针难学的4点原因分析

    难点1. 讨厌的星号 定义指针变量p时,都会加个*号。在用到指针变量p时,也会加个*号。比如以下代码: int main() { int *p; p = malloc(sizeof(int
    发表于 01-16 06:12

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

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

    指针的基础

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

    函数指针指针函数的区别

    = fun(a);   注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有括号()包含,如果
    发表于 12-12 06:34

    函数指针的概念

    函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样
    发表于 12-11 08:10

    如何用函数指针调用函数

    给大家举一个例子: int Func(int x);/*声明一个函数*/ int (*p) (int x);/*定义一个函数指针*/ p = Func; /*将Func函数的首地址赋给指针变量
    发表于 12-11 06:26

    C指针的妙用分享

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

    堆栈指针SP介绍

    SP 堆栈指针:8位寄存器,用来指示堆栈的位置,可由软件修改。 堆栈的介绍堆栈是一种按“先进出”规律操作的存储结构。不同类型的处理器其堆栈的设计各不相同: SP寄存器作为堆栈指针。这种结构的特点是
    发表于 11-17 06:07

    rt_tick_increase 引用指针变量未判断其是否为

    指针变量使用之前没有判断是否为,万一rt_system_scheduler_start此函数调用之前来滴答定时器的中断了,这样操作是不是会有风险
    发表于 10-09 08:07