C言語における、スタックと関数の関係をご紹介します。
スタック
スタックとは、処理中のデータを一時的に退避させるための記憶領域やデータ構造のことです。データの格納と取り出しは、後入先出法(Last In First Out)になります。片側しか開いてない筒のようなものに、データを格納するイメージです。
データを格納することを「プッシュ」、取り出すことを「ポップ」と呼びます。
このようにデータを格納すると、データAを取り出すためにはデータBを先に取り出す必要があり、後入先出となるわけです。
スタックへのデータの一時退避はプログラム実行時に利用され、代表的なものの1つに関数呼び出しがあります。
例えば次のようなプログラムの場合
#include<stdio.h>
int myfunc(void);
int main(void){
myfunc(); //myfunc関数の呼び出し
printf(“main”);
return 0;
}
int myfunc(void) {
printf(“myfunc”);
return 0; //main関数へ処理が戻る
}
main関数の処理にmyfunc関数の呼び出しがありますので処理が移ります。
このときmyfunc関数の処理が終了したら呼び出し元に戻るために、あらかじめ呼び出し元のアドレスを記録しておきます。
その記録場所がスタックということです。
#include<stdio.h>
int myfunc1(void);
int myfunc2(void);
int main(void){
myfunc1(); //①アドレスAをスタックに記録して関数を呼び出し
printf(“main”);
return 0;
}
int myfunc1(void){
myfunc2(); //②アドレスBをスタックに記録して関数を呼び出し
printf(“myfunc1”);
return 0; //④スタックのアドレスAを参照して戻る
}
int myfunc2(void){
printf(“myfunc2”);
return 0; //③スタックのアドレスBを参照して戻る
}
以上になります。
プログラムの文法だけでなくプログラムの処理の仕組みを知ることも、理解を深める上で重要なことなので、積極的に学習していきましょう。