なぜ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 |
| |
.
.
.
l_iSumLocalVar
さて、私の質問は、この関数を実行しているときに、CPU がローカル変数 ( 、l_iLocalVar1
およびl_iLocalVar2
)のアドレスをどのように知るかということです。これらの変数は、値をフェッチする必要があるアドレスを格納するポインターではありません。私の質問は、上記のスタックに関するものです。
質問 2) この関数がさらに他の関数を呼び出した場合、スタックはどのように動作しますか? 私が知っているように、スタックはさらに分割されます。これが真の場合、呼び出し先関数のローカル変数が呼び出された関数から隠される方法。基本的に、ローカル変数がスコープ ルールを維持する方法は?
これらが非常に基本的な質問である可能性があることは知っていますが、これらに対する答えを思いつかない方法もあります。