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
相关产品推荐
相关产品推荐

