C言語学習ポータル(無料版) 学習コンテンツ 関数とスコープ コールスタック——関数呼び出しの舞台裏

🧩 関数とスコープ

コールスタック——関数呼び出しの舞台裏

無料公開版に収録・読む目安 14分

🎯 関数呼び出しでスタックフレームが積まれ、戻るときに降ろされる流れを説明できる

関数を呼ぶと、なぜ元の場所に戻ってこられるのでしょうか。しかも、呼ばれた側のローカル変数はどこに置かれているのでしょうか。その舞台裏がコールスタックです。

食堂のお盆を想像してください。新しいお盆は必ずいちばん上に積み、取るときもいちばん上から取ります。関数の呼び出しもこれと同じ規則で動きます。

#include <stdio.h>

int square(int x)
{
    int r = x * x;
    return r;
}

int calc(int a)
{
    int s = square(a);
    return s + 1;
}

int main(void)
{
    int n = 3;
    int ans = calc(n);
    printf("%d\n", ans);
    return 0;
}

main → calc → square と3段積まれ、square が終わると上から順に降りてきます。降ろされたフレームの中身(x や r)は、そこで消えます。前のトピックの「ブロックを抜けると変数が消える」は、この仕組みの結果だったわけです。

下のビジュアライザで、フレームが積まれて降りる様子を1行ずつ確かめてください。

🧪 ここはメモリの中身を1ステップずつ追う「メモリビジュアライザ」の場面です(アプリ本体で動きます)。

フレームに入っている「帰り道」

フレームの中でいちばん地味で、いちばん重要なのが戻り先の住所です。calc の中で square を呼ぶとき、「終わったら calc の続きに帰る」という情報も一緒に積まれます。これがあるから、同じ square を100か所から呼んでも、それぞれ正しい場所へ帰れます。関数が「行って帰ってこられる」のは、この一枚のメモのおかげです。

積みすぎると崩れる

#include <stdio.h>

void dig(int n)
{
    int buf[1000];       // 呼ぶたびに約4KBを積む
    printf("%d\n", n);
    dig(n + 1);          // 止まらない!
}

int main(void)
{
    dig(1);
    return 0;
}

このプログラムは数千回から数万回で異常終了します(回数は環境によって変わります)。return に到達しないので、フレームは積まれる一方で降りてきません。積む場所には上限があるため、いつか限界に達します。

罠・注意

ビット「行って、帰ってくる」の帰り道を覚えているのがフレーム。だから迷子にならないんだ

まとめ: 呼べば積み、戻れば降ろす。コールスタックはCの実行の背骨で、スコープ・寿命・再帰・ポインタの事故まで、すべてここに繋がります。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

コールスタックこーるすたっく

関数が呼び出されるたびに積み上がっていく、実行中の関数の記録のこと。関数から戻ると一番上から取り除かれる、積み木のような仕組み。スタックオーバーフローは、この積み重ねが限界を超えたときに起きる。

再帰さいき

関数が自分自身を呼び出すことのこと。大きな問題を同じ形の小さな問題に分割して解いていく、独特だが強力な考え方にあたる。階乗の計算や木構造の探索など、繰り返しよりも自然に書ける処理がある。

同じトラックのほかの項目

関数とは——処理に名前を付ける関数の役割と基本の書き方が分かり、自分で作った関数を呼び出せる 引数と戻り値引数で値を受け取り、returnで結果を返す関数を書ける プロトタイプ宣言プロトタイプ宣言の役割を理解し、関数を好きな順番で書けるようになる 変数のスコープ——見える範囲ブロックごとのスコープを理解し、変数がどこから見えるか判断できる 変数の寿命とstatic自動変数とstatic変数の寿命の違いを説明でき、使い分けられる 値渡しの本質引数はコピーが渡ることを理解し、関数内の変更が呼び出し元に届かない理由を説明できる グローバル変数との付き合い方グローバル変数の性質と危険を理解し、使いどころを判断できる 関数分割の設計センス1関数1仕事の原則で、長い処理を読みやすい関数に分けられる 再帰の入口——自分を呼ぶ関数再帰の2要素(停止条件と縮小)を理解し、階乗を再帰で書ける
‹ 変数の寿命とstatic 値渡しの本質 ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH