ローカル変数から値を返す: 驚くべき動作
プログラミングでは、ローカル変数は通常、スタック メモリに格納されます。関数が返されると、関連するスタック フレームが削除され、その中の変数にはアクセスできなくなります。ただし、ローカル変数への参照を返そうとすると、特有の動作が発生します。
提供されたコード スニペットに示されているように、
int& foo() { int i = 6; return i; } int main() { int i = foo(); std::cout << i << std::endl; std::cout << &i << std::endl; }
このコードは、スタックの通常のルールと矛盾しているようです。メモリ管理。 foo 関数のローカル変数 i は、関数が返されるときにスタックから削除されるという事実にもかかわらず、参照された値はメイン関数でアクセス可能なままです。
この異常な動作は、最も一般的な方法の癖によるものです。コンパイラは関数呼び出しを実装します。関数が呼び出されると、コンパイラは関数のローカル変数とパラメータ用にスタック上にメモリ ブロックを予約します。関数の実行中、スタックに割り当てられたメモリは保護され、他の関数がアクセスできないようにします。ただし、関数が戻っても、メモリ保護はすぐには解除されません。代わりに、コンパイラは次の関数呼び出しまで、または現在のスタック フレームが必要なくなるまで待機します。
foo 関数の場合、コンパイラはスタック上のローカル変数 i にメモリを割り当てます。関数が戻ると、i の戻り値は、次の関数呼び出しまたは呼び出し元のスタック フレーム用に予約されている場所に配置されます。これは、foo のスタック フレームが削除されても、ローカル変数 i に割り当てられたメモリはそのまま残り、返された参照を通じてアクセスできることを意味します。
この動作はコンパイラと実装に依存することに注意することが重要です。 。一部のコンパイラは、関数が返された直後にメモリ保護を削除し、未定義の動作を返した後にローカル変数のメモリ位置にアクセスすることを選択する場合があります。したがって、ローカル変数への参照を返すことは一般に避けるべきであり、安全でないコーディング方法であると考えられます。
以上がC でローカル変数への参照を返すことが可能な場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。