2017-12-11 8 views

答えて

6

いいえ。関数のローカル変数が必ずしも同じアドレスにあるとは限りません。

再帰関数を考えてみましょう。ローカル変数が同じ場所にあると想定されていた場合、再帰に出入りするたびに、すべての値をコピーする必要があります。

通常の方法は、各関数呼び出しにスタック上に「ブロック」があることです。行内で同じ関数を2回呼び出すと、ローカル変数のアドレスはおそらく同じになります。再帰的に呼び出すと、2番目の呼び出しはスタックの別の領域にあるため、ローカル変数のアドレスは異なります。

+2

[さらに、プログラムをメモリにロードするソフトウェアは、悪意のある俳優による悪用を防ぐために、プロセスのさまざまな部分をロードするアドレスを故意にランダム化することがあります。](https://en.wikipedia.org/wiki/Address_space_layout_randomization) –

+1

また、関数が複数のスレッド、つまり複数のスレッドから呼び出されたときにどうなるかを検討してください。複数のスタックから取得します。 –

1

コンパイラは、「スタックポインタ」アドレス+オフセットに基づいてメモリアドレスを割り当てるコードを生成します。したがって、各ローカルの実際の物理アドレスは、関数の呼び出しごとに異なります。コンパイラコードのgenロジックが同じになるため、オフセットは毎回同じになる可能性があります。スタックポインターアドレスは、関数の次の呼び出しの前に実行される他のものに基づいて異なる可能性があります。

関連する問題