假设我使用 malloc
在函数内部创建了一个变量:
int f()
{
int* i=(int*)malloc(sizeof(int));
/* ... */
}
变量 i
位于何处?在堆中还是在函数 f()
栈中?
最佳答案
我将使用 p
而不是 i
,因为名为 i
的变量通常是整数。
void function(void) {
int *p = malloc(sizeof(*p));
}
这里有两个东西:p
和*p
,关系如下:
stack heap │ ... │ │ ... │ ┢━━━━━━━┪ ┢━━━━━━━┪ ┃ p ┃ ──→ ┃ *p ┃ ┡━━━━━━━┩ ┡━━━━━━━┩ │ ... │ │ ... │
一旦你从函数返回,p
就消失了。但是,*p
将保持分配状态,直到您调用 free()
。忘记调用 free()
意味着你有一个“内存泄漏”,因为 *p
会永远存在,即使你不能使用它(因为 p
不见了)。
注意 p
不一定在栈上,但你可以假装它在栈上。它可以在寄存器中或完全优化掉。它甚至可以在堆栈上移动。无论如何,“堆栈”和“堆”的整个概念在技术上都是特定于实现的。
关于c - 函数中的 malloc 变量会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40061968/