私は、私は次のコードで取得していますクラッシュによって当惑している:「私は」未満65095枚のその後、すべてのプリントで、すべてが正常に動作している場合多数の再帰関数のクラッシュC/C++
#include <stdio.h>
FILE *ofp;
const char *mode = "r";
char outputFilename[] = "data.txt";
unsigned long long int chaser(unsigned long long int x) {
if (x == 0) {
printf("x was 0 at some point \n",x);
fprintf(ofp,"x was 0 at some point \n",x);
return 0;
}
else {
fprintf(ofp,"initially x in else is %lld\n",x);
x = chaser(x-1) + 1; // recursion overflow?
fprintf(ofp,"after, x in else is is %lld\n",x);
}
return x;
}
int main() {
ofp = fopen(outputFilename, "w");
if (ofp == NULL) {
fprintf(stderr, "Can't open output file %s!\n",outputFilename);
return(1);
}
unsigned long long int i = 65096; // 65095 and above fail
unsigned long long int n;
n = chaser(i);
printf("finished %lld\n",n);
fclose(ofp);
return 0;
}
。
'i'が65095以上に設定されている場合、コンソールには何も印刷されず、win8でクラッシュメッセージが表示され、XPでは終了します。出力ファイルでは、次のようになります。
initially x in else is 29
initially
ファイルの最後の行で「最初」の後に文が終了しません。
明らかにクラッシュはセグメンテーションです。これは、ある種のバッファオーバーフローですか?どうすれば数億に達することができますか?
ありがとうございます。
CまたはC++でコーディングするかどうかがわからないのはなぜですか? – usr2564301
これは「スタックオーバーフロー」と呼ばれています。 – gudok
再帰がスタックオーバーフローを引き起こす理由については、[再帰とスタック](http://stackoverflow.com/questions/35097729/recursion-vs-stack)を参照してください。 – kaylum