#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 处崩溃。 可能是什么问题?
最佳答案
讽刺的是,这实际上是由于递归导致的堆栈溢出。您可以使堆栈变大(这只会延迟问题),或从递归解决方案更改为迭代解决方案。
(无论如何,有些调试器在这种情况下无法为您提供帮助。对于 C 初学者来说,在第一次遇到这个问题之前很难理解出了什么问题。所以恭喜!您正在升级 C)
验证它确实是堆栈溢出的一种廉价方法是在递归函数中的堆栈上创建额外的内存,并查看它崩溃的数字是否从 64901 开始发生变化。我的猜测是,如果您输入 char dummy[ 2048]
在那里,它会崩溃得更快。
关于C素数崩溃于64901,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47480413/