我想知道这段代码中发生了什么?
这里,我在func2
中具有变量f2
,其中经由malloc
向其分配空间块,并且在func1
中具有变量f1
,其也经由malloc
向其分配了空间块。
#include <stdio.h>
#include <stdlib.h>
char* func2(){
char *f2 = (char *)malloc (sizeof(char) * 10);
f2[0] = '1';
f2[1] = '2';
f2[2] = '3';
f2[3] = ' ';
return f2;
}
char* func1(){
char *f1 = (char *)malloc (sizeof(char) * 10);
f1 = func2();
return f1;
}
int main()
{
printf("String: %s", func1());
return 0;
}
现在,由于我已经在func2
中分配了一个堆内存,并且func1
正在调用它,那么func1
应该会释放该内存。但我将返回的值分配给func1
的一个局部变量f1
,并将该变量返回给主函数,我无法在func1
中删除它。
那么,我将如何释放在func2
中分配的内存。func1
中f1
和func2
中f2
的堆内存空间是否相同?
如果您希望func1
释放任何东西,它应该调用free
:
char *
func1(void)
{
char *f1 = malloc (sizeof *f1 * 10);
free(f1);
f1 = func2();
return f1;
}
如果你没有明确释放内存,那么你就有内存泄漏,因为用func2
的结果覆盖f1
会丢弃f1
的前一个值,并且你的程序不再知道之前分配的地址的值,所以你将无法释放它。
malloc返回的值之间没有关系。考虑:
int x = 5;
x = 7;
5号发生了什么事?它被丢弃了。malloc返回的地址并没有什么神奇之处。如果为f1
指定不同的值,则会丢弃以前的值。
当您malloc
一个内存块时,该内存块会一直存在,直到您显式调用它的free
为止。malloc
返回一个指向该内存块的指针,如果您用指向另一内存块的指标覆盖该指针,它不会清除第一个内存块。你可以像William Pursell建议的那样free
——func1
中的旧f1
,也可以一开始就不分配第二块内存,因为分配更多未使用的内存毫无作用:
char* func1() {
char* f1 = func2();
return f1;
}
附带说明一下,您永远不应该强制转换malloc的结果。