堆栈上的变量是“静态分配的”吗?

ran*_*uff 5 c heap-memory dynamic-memory-allocation stack-memory static-allocation

我在阅读这篇文章时看到了这样的内容:“本文假设您至少已经基本了解并理解 GNU/Linux 系统中的内存映射是如何工作的,特别是堆栈中静态分配的内存与堆栈中动态分配的内存之间的区别堆。”

这让我很困惑,因为我认为堆栈和堆是动态分配的,意味着仅在必要时分配,而全局变量和在函数内部声明为“静态”的变量是静态分配的,意味着始终分配。

例如,如果我有

void f() {
    int x = 1;
    ...
}
Run Code Online (Sandbox Code Playgroud)

仅当调用函数 f() 时,值 1 才会被放入堆栈,并且堆栈指针只会递增。同样,如果我有

void f() {
    int x = malloc(1 * sizeof(int));
    ...
}
Run Code Online (Sandbox Code Playgroud)

仅当调用 f() 时才会分配堆内存。但是,如果我有“int x = 1;” 在程序的全局部分或“static int x = 1;” 在函数体内,每当我运行该程序时,该内存都将在数据部分中分配值为 1。

我对这一切有错吗?

ric*_*ici 4

堆栈本身是静态分配的随着控制流进入和离开其作用域,在堆栈中分配的变量会来来去去。