C Prime Number在64901崩溃

时间:2017-11-24 21:50:48

标签: c function recursion

#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压缩。 可能是什么问题?

1 个答案:

答案 0 :(得分:1)

具有讽刺意味的是,由于递归,这实际上是一个堆栈溢出。您可以使堆栈变大(这只会延迟问题),或者从递归解决方案变为迭代解决方案。

(并且值得一提的是,在这种情况下,一些调试器无法帮助你。而且在第一次遇到这个问题之前,C中的初学者很难理解出了什么问题。所以恭喜!你正在升级C)

验证它确实是堆栈溢出的一种便宜的方法是在递归函数中在堆栈上创建额外的内存,并查看它是否因为64901的更改而崩溃。我的猜测是,如果你像tileset一样放入在那里,它会很快崩溃。