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

标签 c

假设我使用 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/

相关文章:

c - 程序打印字符数而不是单词数

c++ - 使用 C++ 编译 GNU C 项目

C: strtof 返回 0.000,怎么了?

c - Linux 上 C 中的 GTK+ 3.0 : handle multiple calls of callback function by signals

javascript - Web Assembly 编译 C 文件时出现内联汇编语言错误

c++ - 从串行 Arduino C 读取符号之间的数据

c - 在 C 中对整数数组求和

C getchar 循环获取用户的整数输入 - [如何改进]

c - 具有未初始化值的 zlib 库压缩

C歧义问题