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

为何这段C代码执行list=tmp后仅释放list而非tmp?是否需释放tmp?

动态数组内存释放疑问解答

问题1解答:tmp指向的内存已经被释放了

这段代码里,tmp指向的内存其实已经在程序结束前被释放了。看代码最后一行的free(list);,此时的list已经不是最初申请的那块3个int的内存——在执行list = tmp;之后,list和tmp指向的是同一块由malloc(4 * sizeof(int))申请的内存空间。所以free(list)本质上就是释放了tmp原本指向的那块内存。

问题2解答:无需重复释放同一块内存

执行list = tmp;后,list和tmp是指向同一块内存的两个指针,不是两块独立的内存。内存本身只有一块,指针只是记录它的地址而已。

代码里的操作逻辑是:

  • 先释放了list最初指向的3个int的内存(free(list);),这一步是丢弃旧的小内存块;
  • 让list接管tmp指向的新内存块(list = tmp;);
  • 最后释放list(也就是新内存块),此时tmp虽然还存着这个内存的地址,但这块内存已经被系统回收了,不能再对tmp执行free——否则就是重复释放同一块内存,会触发C语言的未定义行为(可能导致程序崩溃、内存错乱等问题)。

简单说:要释放的是内存块,不是指针。只要这块内存被通过某个指针释放过,不管有多少个指针指向它,都不能再释放第二次。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:42:44