【发布时间】:2017-11-24 21:50:48
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#define size 20000000
int prim[size];
int i, zahl, zaehler, erg;
int sieve(int zahl, int prim[], int zaehler) {
if(zahl == 2000000)
return 1;
for(i=0; i<=zaehler; i++) {
erg = zahl%prim[i];
if(erg==0) {
zahl++;
return sieve(zahl, prim, zaehler);
}
}
zaehler++;
prim[zaehler]=zahl;
zahl++;
printf("%d\n", prim[zaehler]);
return sieve(zahl, prim, zaehler);
}
int main(){
zaehler = 0;
zahl = 2;
for(i=0;i<size;i++)
prim[i]=2;
sieve(zahl, prim, zaehler);
}
当我试图计算素数时,当我运行这段代码时,它总是在数字 64901 处崩溃。 可能是什么问题?
【问题讨论】:
-
欢迎来到 SO。这是您学习如何调试自己的程序的绝佳机会。与其他人发现你的错误相比,你会从中学到更多。
-
“它总是在数字 64901 处崩溃”并没有多大用处来描述您所看到的错误。它是否说“错误#so-and-so”? “分段故障”?它只是停止就好像它运行成功了吗?等
-
如果你有一个 1MB 的堆栈大小,你将在大约那个数量的递归之后到达底部。
-
“粉碎”->“崩溃”。 :) 正如博所建议的那样,我怀疑您的堆栈已用完。对于
sieve,非递归方法会更好。递归有时很方便,而且有时可能更透明,但如果管理不当,它也会有严重的缺点。 -
如果你使用Linux,比如说,你可以使用
valgrind来调试程序中的内存问题。valgrind ./myprogram.