这个问题在这里已有答案:
我在书中了解到,如果我需要从函数返回指针,我使用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;
}
是的,您的代码是正确的。条件适用,请参阅下面的注释
要向free()
分配内存,您只需要从malloc()
和family传递返回的指针。
当你从malloc()
函数返回Add_them_up()
返回的相同指针并将其存储在presult
中时,在main()
函数中你可以调用
free (presult);
没有任何问题。它将执行预期的工作。
注意:您在这里缺少两个方面,例如:
malloc()
和C家族的回归价值。malloc()
是否成功。也就是说,只是一个建议,总是尝试使用表格
int *p = malloc(sizeof(*p));
这使得分配语句独立于p
的类型,从而产生最强大的代码。
这通常被认为是糟糕的程序设计。执行malloc()的模块应该被设计为它还负责执行free()。
你永远不应该设计程序,以便一些外部例程可以清理模块中的混乱。这真的是常识。
所以在这种情况下,你应该在free()周围添加一个包装函数,main()可以调用它。 main()不需要知道或关心你的例程如何执行动态分配/释放。
请注意,不遵循此程序设计的程序往往会出现与内存泄漏相关的错误。