c-如果我将一个malloc变量设置为等于另一个mallock变量,会发生什么



我想知道这段代码中发生了什么?

这里,我在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中分配的内存。func1f1func2f2的堆内存空间是否相同?

如果您希望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的结果。

相关内容

  • 没有找到相关文章

最新更新