为什么 C 使用堆栈来存储局部变量?这只是为了拥有独立的内存空间还是具有一旦超出范围自动清除所有局部变量和对象的功能?
我还有几个相同的问题,
问题1)如何从指令部分引用局部变量。考虑NewThreadFunc
的是由 createThread 函数调用的函数。
DWORD WINAPI NewThreadFunc(PVOID p_pParam)
{
int l_iLocalVar1 = 10;
int l_iLocalVar2 = 20;
int l_iSumLocalVar = l_iLocalVar1 + l_iLocalVar2;
}
这个线程的堆栈看起来像这样,
| p_pParam |
| NewThreadFunc()|
| 10 |
| 20 |
| 30 |
| |
.
.
.
现在我的问题是,在执行这个函数时,CPU 怎么知道局部变量(l_iSumLocalVar
和l_iLocalVar1
)的地址l_iLocalVar2
?这些变量不是它们存储必须从中获取值的地址的指针。我的问题是上面的堆栈。
问题 2)如果此函数进一步调用任何其他函数,堆栈将如何处理它?据我所知,堆栈会进一步分裂。如果这是真的,被调用函数的局部变量如何从被调用函数中隐藏起来。基本上局部变量如何维护范围规则?
我知道这些可能是非常基本的问题,但有些我怎么想不出答案。