堆栈内存如何工作或如何在堆栈上分配和访问函数变量

lst*_*nme 5 c c++ stack

当我在这个页面上阅读有关Stack和Heap的内容时,
我有一个问题,如果像在页面上给出的示例中一样,函数将所有局部变量放在堆栈上,堆栈是否实际访问了不同的变量?
因为堆栈通常只能访问顶层,所以它只能访问函数的一个变量.
这是否意味着函数的变量存储在堆栈中的结构中?

Som*_*ude 7

与其他任何指针一样,堆栈指针与指针一样,指向正常的标准内存.要访问堆栈的任何区域,您只需向指针添加偏移量即可.

如果你用C指针来思考它,你就有了堆栈指针

char *stack_pointer = some_memory;
Run Code Online (Sandbox Code Playgroud)

然后,该指针可以用作普通指针,包括添加偏移以访问堆栈上的特定位置,例如

*(int *)(stack_pointer + 4) = 5;
Run Code Online (Sandbox Code Playgroud)

我建议你尝试学习汇编程序代码,然后你可以创建一个非常简单的程序,使用一些局部变量,并将其编译为汇编程序代码并阅读它以确切了解它是如何工作的.


cod*_*eim 5

stack semanticsvs stack region(或存储区域)之间经常存在混淆.堆也一样.同样,"基于堆栈的虚拟机(如JVM和CLR)"的激增误导了非C和C++程序员认为本机运行时堆栈的工作方式相同.

区分是很重要的:

  1. 语义与地区 - 一个并不意味着另一个.C和C++堆栈不是Java/CLR堆栈.
  2. "仅基于堆栈的呼叫帧"来自"呼叫帧" - 呼叫帧不必堆叠

大多数体系结构上的堆栈提供了随机访问语义O(1).常见的例子是立即和基本+偏移量寻址模式以及x86中的堆栈和基本指针.实际堆栈区域以LIFO方式分配,但各个变量是 random accessible, O(1).如果你想要堆栈是巨大的,它可能是.

空间像LIFO堆栈一样分配.变量在堆栈中像数组/向量或绝对地址(指针)一样被访问.

所以,不,在C和C++中,您不仅限于一个变量.