假设我使用malloc以下命令在函数内创建变量:
int f()
{
int* i=(int*)malloc(sizeof(int));
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
变量在哪里i?在堆或函数f()堆栈中?
我将使用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不一定在堆栈上,但你可以假装它.它可以在寄存器中或完全优化.它甚至可以在堆栈中移动.无论如何,"堆栈"和"堆"的整个概念在技术上都是特定于实现的.