“本地功能中的malloc,主要的空闲内存”可以吗?怎么样?

时间:2015-08-19 13:33:40

标签: c pointers memory-management free

我在书中了解到,如果我需要从函数返回指针,我使用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;
}

2 个答案:

答案 0 :(得分:6)

是的,您的代码是正确的。条件适用,请参阅下面的注释

free()分配的内存,您只需要传递来自malloc()和系列的返回指针。

当您从malloc()函数返回Add_them_up()返回的相同指针并将其存储在presult中时,在main()函数中,您可以调用

free (presult);

没有任何问题。它将执行预期的工作。

注意:您在此处缺少两个方面,例如

  1. see why not to cast malloc()和家人在C中的返回值。
  2. 在使用返回的指针之前,请务必检查malloc()是否成功。
  3. 那就是说,只是一个建议,总是尝试使用表格

    int *p = malloc(sizeof(*p));
    

    使分配语句独立于p的类型,从而产生最强大的代码。

答案 1 :(得分:3)

这通常被认为是糟糕的程序设计。执行malloc()的模块应该被设计为它还负责执行free()。

你永远不应该设计程序,以便一些外部例程可以清理模块中的混乱。这真的是常识。

所以在这种情况下,你应该在free()周围添加一个包装函数,main()可以调用它。 main()不应该知道或关心你的例程如何执行动态分配/释放。

请注意,不遵循此程序设计的程序往往会出现与内存泄漏相关的错误。