我在书中了解到,如果我需要从函数返回指针,我使用malloc()
并从堆中获取内存。我想知道如何free()
在函数之后分配的内存。
可以按照以下代码执行操作以释放内存吗?如果它不正确,在功能后释放内存的正确方法是什么?
int *Add_them_up (int *x, int *y)
{
int *p = (int *) malloc(sizeof (int));
*p = *x + *y;
return p;
}
int main ()
{
int c = 3;
int d = 4;
int *presult = NULL;
presult = Add_them_up (&c, &d);
printf ("the result of adding is:%d\n", *presult);
free (presult);
return 0;
}
答案 0 :(得分:6)
是的,您的代码是正确的。条件适用,请参阅下面的注释
要free()
分配的内存,您只需要传递来自malloc()
和系列的返回指针。
当您从malloc()
函数返回Add_them_up()
返回的相同指针并将其存储在presult
中时,在main()
函数中,您可以调用
free (presult);
没有任何问题。它将执行预期的工作。
注意:您在此处缺少两个方面,例如
malloc()
和家人在C中的返回值。malloc()
是否成功。那就是说,只是一个建议,总是尝试使用表格
int *p = malloc(sizeof(*p));
使分配语句独立于p
的类型,从而产生最强大的代码。
答案 1 :(得分:3)
这通常被认为是糟糕的程序设计。执行malloc()的模块应该被设计为它还负责执行free()。
你永远不应该设计程序,以便一些外部例程可以清理模块中的混乱。这真的是常识。
所以在这种情况下,你应该在free()周围添加一个包装函数,main()可以调用它。 main()不应该知道或关心你的例程如何执行动态分配/释放。
请注意,不遵循此程序设计的程序往往会出现与内存泄漏相关的错误。