サイタプログラミングスクールC言語プログラミング入門講座 神奈川 楽しめるC言語セミナー レッスンノート ガイダンス・関数呼び出しでスタックを使う目的

ガイダンス・関数呼び出しでスタックを使う目的

C言語プログラミング入門講座のレッスンノート

レッスンノートって?レッスンノートって?

1/9の体験レッスンの内容は、以下の通りです。

 ・ ガイダンス
 ・ 関数呼び出しでスタックを使う目的

詳細は、紙でお渡ししたノートも参照してください。


□ ガイダンス

前半30分程度を使って、ガイダンスを実施しました。

取り組み中のプログラムの内容と問題点については、ここで確認しました。

問題点としては、現状

 ・ スタック使用量が多い

というのがありました。ソースコードを見たところ、関数の再帰呼び出しに原因がありそうでした。

□ 関数呼び出しでスタックを使う目的

関数を呼び出す場合、スタックを使用します。その内容について説明しました。

具体的には、以下の領域用にスタックを使用します

 (1) 呼び出し元関数のアドレスを保持するための領域
 (2) 呼び出し先の引数(仮引数)用の領域
 (3) 呼び出し先の戻り値を格納するための領域
 (4) 呼び出し先関数内のローカル変数用の領域
 (5) その他、コンパイラの都合で確保される領域

(3)については、レジスタで済ます場合も多く必ずしもスタックを使うとは限りません。

また(4)は、ローカル変数を使っていなければ必要ないのでスタックは使いません

今回は、(1)と(2)のためにスタックを使います。


なおここで使用したスタックは、呼び出し先の関数から呼び出し元の関数へ戻らない限り解放されません。

ここで、呼び出し元の関数へ戻る前に自分自身が再帰呼び出しされたらどうなるでしょうか。

当然、最初の呼び出しで使用したスタックはそのままなので、残った空き部分の中から新たに2度目の呼び出しのためにスタックを使うのです。

これは、3段、4段、...と深くなればなるほど解放される前にどんどんスタックを使うことになるため、場合によってはスタック不足になり得るのです。


スタック使用量を減らす観点では、関数の再帰呼び出しはあまりお勧めできません。
新着レッスンノート

9/12のレッスン内容は、以下の通りです。 ・ポリモーフィズムについて ・Javaでの例外処理(try〜catch) 詳細は、お渡ししたノートを参照してください。 ポリモーフィズムは、オブジェクト指向の三大機能のひとつ(他にはカプセル化と継承があります)ですが、その中で...

9/5のレッスン内容は、以下の通りです。 ・ オブジェクト指向の考え方 □ オブジェクト指向の考え方 今取り組んでいるJavaは、純粋なオブジェクト指向のプログラミング言語に分類されます。そして、これはこれまで取り組んできたC言語とは、アプローチ的にも違うことをお話しし...

3/20のレッスン内容は、以下の通りです。 ・ 関数の再帰呼び出し 再帰呼び出しは自己呼び出しとも呼ばれ、関数が自分自身を「再帰的に」呼び出せるしくみのことです。 レッスンでは「1〜nまでの合計を求める」というお題で説明しましたが、他にも階乗、数列の漸化式などで用いられる仕...

3/15のレッスン内容は、以下の通りです。 ・ ポインタの基礎 ・ 変数の有効範囲 今回の詳細も、別途お渡ししたノートを参照してください。

3/15のレッスン内容は、以下の通りです。  ・ 配列の引数の取り扱い  ・ ポインタと配列・文字列の関係 今回の詳細は、別途お渡ししたノートを参照してください。

レッスンノート ページ先頭へ