Базовый cdb: изменяется ли cdb в зависимости от области видимости?
Если я скомпилирую:
int *a;
void main(void)
{
*a = 1;
}
а потом разбирать main в cdb получаю:
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 символизируется указателем проекта! 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 не соответствует ожиданиям?
(Это вдохновлено размышлениями при взгляде на отладку Windows x64: практические основы Дмитрия Востокова).
1 ответ
Когда переменная определена внутри функции, она является автоматической переменной, если явно не объявлена как static. Такие переменные существуют только во время выполнения функции и обычно размещаются в стеке, поэтому они освобождаются при выходе из функции. Изменение, которое вы видите в соответствующем коде, связано не с изменением области действия, а с изменением статической переменной на автоматическую. Если вы сделаете статический объект, он не будет размещен в стеке, даже если его область действия - функция main.