4

私は gdb デバッガーを学習していますが、答えられない質問の 1 つは次のとおりです。新しい関数呼び出しにより、追加のスタック フレームが割り当てられ、呼び出しスタックが下方に成長します。スタック フレームの割り当てが解除され、未使用のメモリに戻されます。スタックの途中にあるフレームを削除してメモリに戻すことは可能ですか? ステートメントまたは longjmp 関数に移動して、これを実現できますか?

どうもありがとう。

4

1 に答える 1

3

いいえ、コール スタックはスタックなので、途中のフレームは削除できません。スタックのトップを指すスタック ポインタ (およびオプションで最後のフレームの先頭を指すフレーム ポインタ) のみが維持されます。フレームが「削除」(関数から戻る) されると、これらのポインターのみが移動され、次に割り当てられたフレームがこれを上書きします。

このスレッド(および他のいくつかのスレッド) は、longjmp がこの動作に違反できない理由を説明しています。つまり、setjmp はフレーム位置を保存しますが、フレーム自体が上書きされている場合、これは失敗します。また、goto は別の関数にジャンプできません。

于 2014-03-13T07:46:42.940 に答える