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

C语言中用指针别名存malloc地址,后续调用free()是否正常?

你的代码可以正常工作,但有几个细节要注意

首先明确一个关键:free()函数只认你传给它的内存地址,不管这个地址是存在原指针变量里还是它的别名里。只要地址是malloc/calloc/realloc返回的有效地址,用哪个变量传进去都能正确释放内存。

看你的代码逻辑:

  • 每次进入fun()时,先检查全局变量gList是否非空,释放它——这一步是对的,避免之前分配的内存泄漏,确保重新分配前清空旧内存。
  • 分配新内存给list,再把gList指向这块内存——此时gList和list指向同一块内存区域,本质就是给这块内存的地址起了个“别名”。后续不管是用free(gList)还是free(list)(只要list还没被覆盖),都能正确释放这块内存。

不过有几个潜在的坑要提一下:

  • malloc的大小可能写错了:你声明的是char *list,但malloc的是count * sizeof(char *)——如果你的目的是分配count个char类型的空间,应该写成count * sizeof(char);如果是要分配count个char*指针的数组,那list的类型应该是char **list,这里大概率是笔误,得修正。
  • 要检查malloc的返回值:如果内存分配失败,malloc会返回NULL,这时候gList会被设为NULL。虽然free(NULL)是标准允许的(不会触发错误),但如果后续代码里要使用gList,得先判断它是不是空指针,避免访问非法内存。
  • 全局变量的线程安全问题:gList是全局变量,如果多线程环境下调用fun(),可能会出现多个线程同时修改、释放gList的情况,导致重复释放或者野指针,这种场景下要加锁保护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:49:23