基本的cdb:cdb会改变它的范围吗?

时间:2011-05-18 17:24:08

标签: 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只是偏离堆栈指针(我相信),而不是我期望的人类可读结构(比如说,指针项目!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的符号不是我所期望的吗?

(这受到了沉思,同时看着x64 Windows调试:Dmitry Vostokov的实践基础)。

1 个答案:

答案 0 :(得分:4)

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