c - 基本 cdb : does cdb vary how it notates scope?

标签 c cdb

如果我编译:

int *a;

void main(void)
{
    *a = 1;
}

然后在 cdb 中反汇编 main 我得到:

pointersproject!main:
00000001`3fd51010 mov     rax,qword ptr [pointersproject!a (00000001`3fd632f0)]
00000001`3fd51017 mov     dword ptr [rax],1
00000001`3fd5101d xor     eax,eax
00000001`3fd5101f ret    

所以 *a 由 pointersproject!a 符号化。一切顺利。

但是,如果我在 main 中声明指针:

void main(void)
{
    int *a;
    a = 1;
}

我看到 a 只是堆栈指针的偏移量(我相信),而不是我期望的人类可读结构(比如 pointersproject!main!a):

pointersproject!main:
00000001`3fd51010 sub     rsp,18h
00000001`3fd51014 mov     rax,qword ptr [rsp]
00000001`3fd51018 mov     dword ptr [rax],1
00000001`3fd5101e xor     eax,eax
00000001`3fd51020 add     rsp,18h
00000001`3fd51024 ret

这可能与我对编译器所做的事情的理解一样重要,除了:谁能解释为什么 a 的符号不是我所期望的?

(这受到 Dmitry Vostokov 在看 x64 Windows 调试时的沉思启发:实用基础)。

最佳答案

当变量定义在函数内部时,它是一个自动变量,除非明确声明为 static。这些变量仅在函数执行期间存在并且通常在堆栈中分配,因此在函数退出时它们将被释放。您在编译代码中看到的变化不是由于范围的变化,而是由于从静态变量到自动变量的变化。如果你创建一个静态的,它就不会在栈中分配,即使它的作用域是函数 main。

关于c - 基本 cdb : does cdb vary how it notates scope?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6048602/

相关文章:

c++ - 在 C、C++ 中的初始化中排序

c - 运行时错误,在数组中输入字符串

c - 如何计算 C 中 fork() 系统调用的运行时间?

.net - 不能 .loadby sos mscorwks 或 .loadby sos clr

c++ - C++ Rhel confd cdb_get以奇怪的顺序返回元素

python - 我可以使用 C 模块绕过 python GIL 吗?

c - 为什么float的最小值是0?

yii - 谁能解释 CDbCriteria->scopes 是如何工作的?

database - cdb - 大文件(数百 GB)的常量键值存储