そこで、システムの限界を試すために、意図的にスタックオーバーフローを引き起こすおもちゃのCプログラムを作成しました。
#include <stdio.h>
int kefladhen(int i) {
int j = i + 1;
printf("j is %d\n",j);
kefladhen(j);
}
int main() {
printf("Hello!:D\n");
kefladhen(0);
}
セグメンテーション違反の前に印刷された最後の行が「jis174651」であることに驚いた。もちろん、実行するたびに正確な数は少し異なりますが、一般的に、4GBのLinuxラップトップのプロセスのメモリを使い果たすのに174,000の奇数スタックフレームで十分であることに驚いています。printfにオーバーヘッドが発生しているのではないかと思いましたが、kefladhen()を再帰的に呼び出す前にprintfが戻るため、スタックポインタは以前の場所に戻るはずです。呼び出しごとに正確に1つのintを格納しているので、各スタックフレームは合計で8バイトだけである必要があります。つまり、174万の奇数は、実際に使用されるメモリの約1メガバイトと半分にすぎません。これは、私にはかなり低いように思われます。私はここで何を誤解していますか?