プログラム実行時のスタック領域とヒープ領域の役割

正解は「ア」です。 プログラム実行時のメモリ領域は、主に以下のように使い分けられます。 ・スタック領域(Stack): サブルーチンや関数の呼び出し時に、戻り番地(リターンアドレス)や局所変数(ローカル変数)、引数などを一時的に格納するために LIFO(後入れ先出し)順で自動的に割り当て・解放される領域です。 ・ヒープ領域(Heap): プログラムの実行中に、アプリケーションが動的にメモリ割り当て(C言語の malloc 、Java/C++の new 等)を要求した際に確保され、明示的な解放( free やガベージコレクション)が行われるまで保持される領域です。割当てと解放が任意の順序で行われるため、断片化(フラグメンテーション)が発生しやすい特徴があります。 ヒープ領域にも未使用領域はあります。確保と解放が任意の順序で行われるため、使われない小さな空き(断片化)が生じやすいのはむしろヒープ領域です。 ヒープ領域はスタック領域の予備ではなく、用途の異なる別の領域です。スタック領域が一杯になると スタックオーバーフロー となり、ヒープ領域で肩代わりすることはありません。 プッシュとポップ(後入れ先出し)でデータを出し入れするのはスタック領域です。ヒープ領域は任意の順序で確保・解放します。

プログラムの実行時に利用される記憶領域にスタック領域とヒープ領域がある。それらの領域に関する記述のうち,適切なものはどれか。

出典平成31年 春期 応用情報技術者試験 午前 問17
ア
サブルーチンからの戻り番地の退避にはスタック領域が使用され,割当てと解放の順序に関連がないデータにはヒープ領域が使用される。
イ
スタック領域には未使用領域が存在するが,ヒープ領域には未使用領域は存在しない。
ウ
ヒープ領域はスタック領域の予備領域であり,スタック領域が一杯になった場合にヒープ領域が動的に使用される。
エ
ヒープ領域も構造的にはスタックと同じプッシュとポップの操作によって,データの格納と取出しを行う。