You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50第4周Recover代码理解疑问及内存泄漏问题咨询

CS50 Recover(JPEG恢复)代码疑问解答

对代码理解的指正

你对代码整体逻辑的理解基本正确,但有两处细节需要修正:

  • JPEG头检测:仅检测前4字节为0xff、0xd8、0xff、0xe0不够全面,标准JPEG的起始标记是前3字节固定为0xff、0xd8、0xff,第4字节为0xe0到0xef之间的任意值(对应APP0到APP15标记),这样的检测逻辑才能覆盖所有有效JPEG文件头。
  • 初始化阶段的内存管理:你提到用malloc分配了filename指针,但如果程序结束前没有调用free(filename)释放这块内存,也会造成内存泄漏,这一点需要注意。

疑问解答

  1. 调用fopen(filename, "w")时,是否会自动创建新文件?
    是的。使用"w"模式调用fopen时:
  • 若指定文件名不存在,会自动创建新的空文件;
  • 若文件已存在,会清空文件原有内容,重新开始写入。
  1. 运行代码出现内存泄漏,是否是因为打开新输出文件前未关闭之前的输出文件导致的?
    这是主要原因之一,同时还有另一项可能:
  • 文件资源泄漏:每次打开新的输出文件前,如果没有关闭之前打开的output_file指针(即未调用fclose(output_file)),会导致系统中残留未释放的文件描述符,属于资源泄漏范畴;
  • 堆内存泄漏:你通过malloc分配的filename内存,如果在程序退出前没有用free(filename)释放,也会造成堆内存泄漏。

解决方法:

  • 在检测到新JPEG头、准备打开新输出文件前,先判断output_file是否不为NULL,若是则调用fclose(output_file)关闭旧文件;
  • 程序执行完毕、退出前,调用free(filename)释放分配的文件名内存。

内容的提问来源于stack exchange,提问作者King Brain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:50:10