2015-08-19 16 views
6

我在书中学到如果我需要从函数返回一个指针,我使用malloc()并从堆中获取内存。我想知道如何在功能后分配内存。“本地函数中的malloc,主要空闲内存”可以吗?怎么样?

是否可以在下面的代码中执行以下操作来释放内存?如果它不正确,那么在函数之后释放内存的正确方法是什么?

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; 
} 
+3

请查看[为什么不投射](http://stackoverflow.com/q/605845/2173917)'malloc()'和'C'中的系列的返回值。 –

+0

@shinhwa有一个严重的问题,你在这里失踪。 –

+0

@SouravGhosh你忽略了一个严重的问题我的朋友。 –

回答

6

是的,你的代码是正确的。 条件适用,请参见下面

记要free()分配的内存,你只需要返回的指针从malloc()和家人通过。

当你得到通过malloc()Add_them_up()功能回到返回相同的指针并将其储存在presult,在main(),你可以调用

free (presult); 

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


注意:这里缺少两个方面,例如,

  1. see why not to castmalloc()和家人在C返回值。
  2. 在使用返回的指针之前,请始终检查malloc()是否成功。

这就是说,只是一个建议,始终尝试使用形式

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

这使得独立的p类型的配置语句,导致最健壮的代码。

+1

感谢您的意见和解释。我意识到第二个方面,我正在学习第一个方面。 – shinhwa

+0

就语法和功能而言,代码是正确的,但这是糟糕的程序设计。 – Lundin

3

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

您不应该设计程序,以便某些外部例程应该清理模块中的垃圾。这确实是所有的常识。

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

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

+0

那么说,我认为还有一个问题被遗漏了。 –

+1

@Sumeet悬挂指针只是一个问题,如果期望再次使用相同的输入调用例程。在这种情况下,它由malloc/free来处理它的例程决定。 – Lundin

+0

但仍然使它成为一件好事,你不觉得。 –

相关问题