鱼C论坛

 找回密码
 立即注册
查看: 611|回复: 7

[已解决]接上一个提问,来自《带你学C带你飞》S1E46:单链表2

[复制链接]
发表于 2023-11-29 22:35:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
上一个提问:https://fishc.com.cn/thread-237095-1-1.html
上一个内容:

                               
登录/注册后可看大图

来自《带你学C带你飞》S1E45:单链表1
小甲鱼犯了什么错误了?

我认为的最佳回答:

柿子饼同学 的回答:
你先执行 free 了 , 相当于这本书已经不存在了 , 怎么再找到被删除的这本书的后继呢

应该是用一个临时指针 temp 指向现在的这本书
然后 library = library->next
然后 free(temp)
酱紫先跳到这本书的下一本 , 然后把这一本删除才对


感谢柿子饼同学回复,小甲鱼在下一节课的开头也说了这个问题,但是他把Library换成了指针的指针传进来,为什么一定要传Library的地址进来呢,不能还是传值吗?
这是小甲鱼的修改代码

                               
登录/注册后可看大图

这是我的修改代码
  1. void releaseLibrary(struct Book *headLibrary)
  2. {
  3.     struct Book *temp;
  4.     while(headLibrary != NULL)
  5.     {
  6.         temp = headLibrary;
  7.         headLibrary = headLibrary->next;
  8.         free(temp);
  9.     }
  10. }
复制代码
最佳答案
2023-11-29 22:35:34
传递指针的指针是为了能够修改指针本身的值,从而达到在函数内部修改指针的目的。如果只传递指针的值,函数内部对指针的修改不会影响到外部的指针。

在这个问题中,小甲鱼传递指针的指针是为了能够在函数内部将头指针(headLibrary)置为NULL,以表示链表已经被释放。这样做的好处是,当函数返回后,调用者可以通过检查头指针是否为NULL来确定链表是否已经被释放。而如果只传递指针的值,函数内部对指针的修改并不能影响到调用者。

你的修改代码中,传递指针的值也是可以实现释放链表的功能的。但是需要注意,在函数内部释放指针时,不能直接将指针置为NULL,因为这样做只会修改函数内的指针副本。为了能够修改外部的指针值,你需要在函数返回之前,手动将外部指针置为NULL。

总结起来,传递指针的指针可以更方便地释放链表,并且在函数返回后能够及时反馈链表被释放的状态,但传递指针的值也是可以实现相同功能的,只需要在函数返回之前手动将指针置为NULL即可。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-29 22:35:34 | 显示全部楼层    本楼为最佳答案   
传递指针的指针是为了能够修改指针本身的值,从而达到在函数内部修改指针的目的。如果只传递指针的值,函数内部对指针的修改不会影响到外部的指针。

在这个问题中,小甲鱼传递指针的指针是为了能够在函数内部将头指针(headLibrary)置为NULL,以表示链表已经被释放。这样做的好处是,当函数返回后,调用者可以通过检查头指针是否为NULL来确定链表是否已经被释放。而如果只传递指针的值,函数内部对指针的修改并不能影响到调用者。

你的修改代码中,传递指针的值也是可以实现释放链表的功能的。但是需要注意,在函数内部释放指针时,不能直接将指针置为NULL,因为这样做只会修改函数内的指针副本。为了能够修改外部的指针值,你需要在函数返回之前,手动将外部指针置为NULL。

总结起来,传递指针的指针可以更方便地释放链表,并且在函数返回后能够及时反馈链表被释放的状态,但传递指针的值也是可以实现相同功能的,只需要在函数返回之前手动将指针置为NULL即可。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-11-29 22:53:42 | 显示全部楼层
FishC_GPT 发表于 2023-11-29 22:35
传递指针的指针是为了能够修改指针本身的值,从而达到在函数内部修改指针的目的。如果只传递指针的值,函数 ...

但是释放完了以后程序就结束了,把头指针置为NULL是不是也无所谓了。
还有一个问题:如果我不对单链表进行手动free,那程序结束以后会自动free吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-29 22:53:56 | 显示全部楼层
BaysideLizard 发表于 2023-11-29 22:53
但是释放完了以后程序就结束了,把头指针置为NULL是不 ...

是的,如果程序结束后,操作系统会自动回收所有未释放的内存资源,包括单链表所占用的内存。因此,如果你没有手动释放单链表的内存,在程序结束时,操作系统会自动释放这些内存。

然而,推荐在程序中手动释放动态分配的内存,特别是在长时间运行的程序或者内存使用较大的程序中。这样可以确保及时释放不再使用的内存,减少内存的泄漏问题,并提高程序的性能。

在释放单链表时,需要遍历链表,逐个释放每个节点的内存。如果使用`malloc`函数为节点分配了内存,那么应该使用`free`函数来释放内存。如果使用`calloc`函数或者`realloc`函数为节点分配了内存,那么应该使用`free`函数来释放内存。

总结一下,尽管程序结束时会自动释放单链表所占用的内存,但最好还是养成良好的编程习惯,在不再使用某个动态分配的内存时,手动释放它们,以防止内存泄漏问题的出现。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-29 22:56:38 | 显示全部楼层
FishC_GPT 发表于 2023-11-29 22:53
是的,如果程序结束后,操作系统会自动回收所有未释放的内存资源,包括单链表所占用的内存。因此,如果你 ...

什么是内存泄漏?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-29 22:57:01 | 显示全部楼层

内存泄漏指的是在程序中分配了内存空间,但在不再需要使用这些内存空间时,没有正确地释放它们。也就是说,当你无法再访问或使用某个内存空间时,却没有将其还给操作系统,造成内存无法被回收的情况,从而导致程序占用的内存逐渐增加,最终可能导致系统资源耗尽。

内存泄漏通常发生在动态分配内存的场景中,例如使用 `malloc`、`calloc` 或 `new` 在堆上分配内存。如果在使用完内存之后没有调用对应的释放内存的函数(例如 `free`、`delete`),那么这块内存将永远无法被回收,造成内存泄漏。

内存泄漏可能会导致程序运行速度变慢,甚至崩溃。尤其是在长时间运行的程序、循环执行的程序或大量使用动态内存分配的程序中,内存泄漏问题会对性能和可靠性产生严重影响。

为了避免内存泄漏,需要确保在不再需要使用动态分配的内存时,及时调用相应的释放函数进行内存释放。同时,编写良好的代码结构和内存管理策略,并使用一些工具和技术(如内存分析工具、智能指针等)来帮助检测和避免内存泄漏问题的发生。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-29 23:06:47 | 显示全部楼层
FishC_GPT 发表于 2023-11-29 22:57
内存泄漏指的是在程序中分配了内存空间,但在不再需要使用这些内存空间时,没有正确地释放它们。也就是说 ...

感谢你的回复 : )
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-29 23:06:56 | 显示全部楼层

不客气,我很高兴能够帮助到您!如果您有任何其他问题或需要进一步的解答,请随时告诉我。我将尽力为您提供帮助。祝您编程学习顺利!

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 13:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表