論理的には、q
終了すると存在しなくなりfun
ます。
物理的に(「物理的」の適切に緩い定義の場合)、ストーリーはもう少し複雑で、基盤となるプラットフォームによって異なります。Cはガベージコレクションを行いません(この場合、ガベージコレクションは適用されません)。占有されていたメモリセル(仮想または物理)q
はまだ存在し、最後に書き込まれた値が含まれています。アーキテクチャ/オペレーティングシステムなどによっては、プログラムからそのセルにアクセスできる場合がありますが、それは保証されていません。
6.2.4オブジェクトの保存期間
2オブジェクトの存続期間は、ストレージがそのオブジェクト用に予約されることが保証されているプログラム実行の部分です。オブジェクトが存在し、定数アドレス33)
を持ち、その存続期間を通じて最後に保存された値を保持します。34)
オブジェクトがその存続期間外に参照された場合、動作は定義されていません。ポインタが指す(またはちょうど過ぎた)オブジェクトがその存続期間の終わりに達すると、ポインタの値は不確定になります。
33)「定数アドレス」という用語は、おそらく異なる時間に構築されたオブジェクトへの2つのポインターが等しく比較されることを意味します。同じプログラムを2回実行すると、アドレスが異なる場合があります。
34)揮発性オブジェクトの場合、最後のストアはプログラムで明示的である必要はありません。
「未定義動作」は、問題に対処しないことによって問題に対処するC言語の方法です。基本的に、実装は、問題を完全に無視し、基盤となるOSにいたずらなことをするためにプログラムを強制終了させるまで、選択した方法で状況を自由に処理できます。
あなたの特定のケースでは、終了後にそのメモリセルにアクセスしてfun
も何も壊れず、まだ上書きされていませんでした。その動作は、再現可能であることが保証されていません。