Eratosthenes的筛子:SIGSEGV?

时间:2013-08-29 21:02:52

标签: c

我已经编写了筛子的代码,但程序只运行小于或等于1000000的数组。对于其他更大的情况,会出现一个简单的SIGSEGV。可以这样做运行案例> 1000000.或者我错在哪里?

    #include <stdio.h>
    int main()
    {
    unsigned long long int arr[10000001] = {[0 ... 10000000] = 0};
    unsigned long long int c=0,i,j,a,b;
    scanf("%llu%llu",&a,&b);
    for(i=2;i<=b;i++)
        if(arr[i] == 0)
            for(j=2*i;j<=b;j+=i)
                arr[j] = 1;
    for(i=(a>2)?a:2;i<=b;i++)
    if(arr[i] == 0)``
        c++;
    printf("%llu",c);
    return 0;
    }

2 个答案:

答案 0 :(得分:9)

此行在堆栈上分配内存(这是一种有限的资源)

unsigned long long int arr[10000001] = {[0 ... 10000000] = 0};

如果要分配10,000,000个条目,每个条目4个字节,那就是4000万个字节,这将超过你的堆栈可以处理的。

(或者,在您的平台上,long-long-int很可能是8个或更多字节,表示使用了80万个字节!)

相反,从堆中分配内存,这是非常丰富的:

int* arr = malloc(10,000,000 * sizeof(int));  // commas for clarity only. Remove in real code!

或者,如果您希望将内存初始化为零,请使用calloc

然后在你的程序结束时确保你也释放它:

free(arr);

PS 语法{[0 ... 10000000] = 0};不必要地冗长。 要将数组初始化为零,只需:

int arr[100] = {0};  // Thats all!  

答案 1 :(得分:5)

您声明了一个可以容纳10000001个项目的数组;如果你想处理更大的数字,你需要一个更大的数组。我有点惊讶它已经有100万个工作了 - 这需要很多堆栈空间。

编辑:对不起 - 没有注意到你有不同数量的零。不要使用堆栈来分配你的阵列,你应该没问题。只需将static添加到数组声明中,您就可以了。