C语言中malloc分配的变量被赋值给另一变量后该如何正确释放内存?
代码逻辑问题解答
关于free的调用规则
- 你执行
int *Y = X时,只是把X存的堆内存地址值拷贝给Y,此时X、Y两个指针变量是相互独立的,但共同指向同一块malloc申请的堆内存。 free的作用是释放参数指向的那块堆内存本身,和这个地址值被拷贝给了多少个指针没有任何关系。你代码里已经执行了free(Y),X指向的那块内存已经被完全释放,此时X、Y存的地址都成了无效的野地址,再调用free(X)属于双重释放,是明确的未定义行为,会直接破坏堆内存结构,导致程序崩溃,绝对不能这么做。
关于Y的内存申请问题
- 完全不需要给Y单独调用
malloc。 - 没有规则要求“每个指针都必须对应一块独立申请的堆内存”。Y只是一个存了已有内存地址的临时副本,本身不拥有内存所有权,直接赋值X的地址是完全合法的操作,不存在状态错误的问题。
这段代码的实际运行状态
- 从内存管理逻辑来说,你写的这段代码是合规的:一次堆内存申请、一次对应释放,没有内存泄漏,也没有越权访问问题。
- 实际工程里需要补充的细节是:
malloc申请失败会返回空指针,最好在申请后加非空判断,避免后续*X = 10的解引用操作触发空指针异常。
内容的提问来源于stack exchange,提问作者overworked student
相关产品推荐
相关产品推荐

