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

C语言malloc堆内存分配与free释放代码是否正确?

代码问题排查结论

编译无报错无警告不代表代码逻辑和内存操作是正确的,C语言大量未定义行为不会在编译阶段被检测出来,你的代码存在以下明确问题:

  • 指针访问语法本身没有错误:*(arrPtr + i)和arrPtr[i]是完全等价的写法,这个偏移访问的语法规则你没有用错,问题出在访问范围、内存初始化和配套逻辑上。
  • 堆内存越界访问:你通过malloc(sizeof(char)*100)申请的堆空间总计100字节,合法访问的索引范围是0~99,但循环条件写的是i<101,当i取100时会读写申请范围之外的内存,属于典型的缓冲区溢出,会触发未定义行为——轻则篡改其他内存位置的正常数据,重则直接导致程序崩溃。
  • 未校验内存申请结果:malloc存在申请失败的可能(比如系统剩余内存不足时会返回NULL),你没有做任何判空处理就直接解引用arrPtr,一旦申请失败会立刻触发空指针访问错误。
  • 读取未初始化的内存:malloc申请到的堆内存不会自动清空或初始化,内存里存的是之前程序运行残留的随机垃圾值,你直接拿这些随机值做取模、除法判断,得到的结果完全是随机的,和题目要求的逻辑没有任何关系。
  • 分支逻辑覆盖问题:你写了两个独立的if判断,不是互斥的if-else结构:就算第一个条件满足,给对应位置赋值了'a',后面的第二个if/else分支也会重新判断、覆盖之前的赋值,最终数组里根本不会保留'a',第一个判断分支完全失效。
逻辑验证方法

void返回值不影响你验证函数内部逻辑,你只需要在调用free(arrPtr)之前加一段循环,把数组每个位置的字符打印到控制台,或者用调试工具加断点查看arrPtr指向的内存内容,就能直接看到运行结果,不需要依赖函数返回值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:18:15