変数がコード ブロック内で宣言される場合、そのスコープは、アクセスできるコードの部分を定義します。 。しかし、変数のスコープが終了すると、変数に割り当てられたメモリはどうなるでしょうか?それはすぐに上書きされますか? それとも、それが存在する関数が終了するまで予約されたままですか?
この質問は、次のコード スニペットから生じます:
foo() { int *p; { int x = 5; p = &x; } int y = *p; // undefined behavior }
変数 x のメモリが存在する場合がスコープ外に出た後もまだ割り当てられている場合、ポインタ p は正しい場所を指し続け、x の値がスコープ外になってもアクセスできるようになります。
この謎を解明するには、スコープとライフタイムの概念を詳しく掘り下げる必要があります。
スコープには、コードのセクションが含まれます。変数にアクセスできるようになります。変数が中括弧 ({}) 内で宣言されている場合、そのスコープは囲まれたコード ブロックに制限されます。
Lifetime には、変数またはオブジェクトは有効な状態で存在します。自動変数またはローカルの非静的変数の場合、その有効期間はスコープ内に限定されます。つまり、これらの変数はスコープが終了すると自動的に破棄されます。
指定されたコード スニペットでは、変数 x は非静的ローカル変数として宣言されています。つまり、その有効期間はそのスコープにバインドされています。内部スコープが終了すると、x は存在しなくなり、ポインター p は無効な場所を指したままになります。
その結果、p を介して x の値にアクセスしようとすると、未定義の動作になります。コンパイラは、そのスコープを超えて x にメモリを割り当てる場合と割り当てない場合があり、その結果、予測できない結果が生じます。したがって、スコープが終了した変数へのアクセスを避けることが重要です。
以上がスコープが終了した後、変数メモリはどうなりますか? すぐに上書きされるか、関数が終了するまで予約されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。