【发布时间】:2013-07-05 01:16:57
【问题描述】:
为什么 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) 如果该函数进一步调用任何其他函数,堆栈将如何处理它?据我所知,堆栈会进一步分裂。如果这是真的,被调用函数的局部变量如何从被调用函数中隐藏起来。基本上局部变量是如何维护作用域规则的?
我知道这些可能是非常基本的问题,但有些问题我想不出答案。
【问题讨论】:
-
这和Windows有什么关系?
-
C 没有指定(局部)变量的存储位置或方式,因此它不一定是堆栈。
-
确实如此,但实际上每个实现都使用堆栈,因为这就是世界上所有硬件的工作方式。你知道有什么例外吗?
-
抱歉,它不是专门针对 windows 的。。
标签: c stack internals variable-address