このように、関数は必ず自分を呼び出した場所に制御を復帰させるため、関数の中で別の関数を呼び出し、さらにその中で別の関数を呼び出すといった複雑な構造になっても、強制終了されない限り、最後には必ずmain()関数に制御が戻ってきます。

サンプル02

#include <stdio.h>

void func1(void)
{
    printf("func1() 関数が実行されました\n");
}

void func2(void)
{
    printf("func2() 関数の開始\n");
    func1();
    printf("func2() 関数の中間\n");
    func1();
    printf("func2() 関数の終了\n");
}

int main(void)
{
    printf("main() 関数の開始\n");
    func2();
    printf("main() 関数の終了\n");

    return 0;
}

実行結果

サンプル02の実行結果

サンプル02は、main()関数からfunc2()関数を呼び出し、さらにfunc2()関数からfunc1()関数を呼び出している例です。このように、階層的に関数を呼び出しあっても、関数の処理が終了した時点で、制御は関数を呼び出した元の関数に戻ります。よって、最終的にはmain()関数まで戻って処理が終了します。