gpt4 book ai didi

c - C 中局部堆栈变量存储在哪里?

转载 作者:行者123 更新时间:2023-11-30 20:29:23 24 4
gpt4 key购买 nike

我在 C 中有以下程序:

1  #include<stdio.h>
2
3 int main(void) {
4 int i=0;
5 for (int k=0; k<10; k++)
6 printf("Number: %d", k);
7 printf("Hello\n");
8 return 0;
9 }

当我在 gdb 中运行它时,它会列出所有寄存器,但我在任何寄存器中都没有看到变量 k。例如,在下面的屏幕截图中,我知道 k=4,但我在任何寄存器中都没有看到该值。那么这个数字将存储在哪里?

enter image description here

最佳答案

I know k=4, but I don't see that value in any of the registers. Where would this number be stored then?

如果您优化了程序,该值确实可能会存储在寄存器中(但程序将更难以调试)。

未经优化,该值存储在堆栈上(准确地说,考虑到反汇编,它存储在位置 $rbp-8 处),并由下一条指令加载到寄存器中(您停止的之前)。

如果您执行stepi并查看$rax的值,您就会在那里找到它。

附注info locals 将为您提供有关局部变量的信息。

更新:

What does stepi do?

它执行一条机器指令,然后停止。您可以通过阅读手册或使用 help stepi GDB 命令来找到这一点。

What/were is $rbp-8? Could you please explain a bit more about what that is and how it works?

每一本 x86 编程入门书籍或教程都会介绍这一点。

简单地说,程序执行的当前状态可以描述为一系列链接的激活记录或“帧”。在未经优化的 x86 上,$RBP 寄存器通常用作帧指针寄存器(即它指向当前帧)。局部变量存储在距帧指针负偏移处(此处,k 存储在偏移量 -8 处)。

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

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