函数中的malloc变量会发生什么?

dou*_*leE 0 c

假设我使用malloc以下命令在函数内创建变量:

int f() 
{
 int* i=(int*)malloc(sizeof(int));
 /* ... */
}
Run Code Online (Sandbox Code Playgroud)

变量在哪里i?在堆或函数f()堆栈中?

Die*_*Epp 6

我将使用p而不是i,因为命名i的变量通常是整数.

void function(void) {
    int *p = malloc(sizeof(*p));
}
Run Code Online (Sandbox Code Playgroud)

这里有两件事:p*p具有以下关系:

  stack          heap
?   ... ?     ?   ... ?
?????????     ?????????
?     p ? ??? ?    *p ?
?????????     ?????????
?   ... ?     ?   ... ?

一旦从函数返回,p就消失了.但是,*p在您致电之前,我们将继续分配free().忘记打电话free()意味着你有"内存泄漏",因为*p即使你不能使用它也会永远存在(因为p它已经消失).

注意: p不一定在堆栈上,但你可以假装它.它可以在寄存器中或完全优化.它甚至可以在堆栈中移动.无论如何,"堆栈"和"堆"的整个概念在技术上都是特定于实现的.