gpt4 book ai didi

c - 局部变量如何存储在堆栈中?

转载 作者:行者123 更新时间:2023-12-01 13:20:37 28 4
gpt4 key购买 nike

众所周知,当我们声明局部变量时,它们会存储到堆栈中,即 FILO。但是我被要求画一个图表来显示这些变量是如何被压入堆栈的?好吧,我对给出的示例代码有点困惑:

int giveMe_Red(int *xPos, int *yPos)
{
int count = 0;
int *nextpos, ifTreped;
int loc[8] = {0};
.
.
.
.
return count;
}

谁能帮我理解每个变量是如何存储到内存中的,比如数组、指针等。比如,“count”在 0 级,然后是“*nextpos”在堆栈的 1 级或其他东西。如果存在递归,那么它们是如何存储的?

最佳答案

细节取决于处理器,但例如在 x86 中,通常所有变量的堆栈空间都是一次性分配给 esp 的。标准序言是

push ebp                ; Save old base pointer
mov ebp, esp ; Mark current base pointer
sub esp, stack_space ; Allocate stack space

结语是

mov esp, ebp            ; Free stack space
pop ebp ; Reload old base pointer
ret ; Return to caller

在您的情况下,所需的空间(假设 32 位并且这些都是本地人)将是

  • 4 个字节用于count
  • 4 表示 nextPos
  • 4 表示 ifTreped
  • loc 数组为 4*8

总共 44 个字节(+ 4 个用于保存 ebp 所需的空间)。

sub esp, 44 之后会有将 loc 的所有元素归零的代码。

编辑

在用 gcc 检查后,分配的空间似乎是 48 字节(不是 44),不知道为什么,但可能是堆栈对齐的原因。

关于c - 局部变量如何存储在堆栈中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19087630/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com