3

我已经为筛子编写了代码,但程序仅针对小于或等于 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;
    }
4

2 回答 2

9

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

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

如果您分配 10,000,000 个条目,每个条目 4 个字节,即 4000 万字节,这将超出您的堆栈可以处理的范围。

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

相反,从堆中分配内存,这要丰富得多:

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!  
于 2013-08-29T21:06:08.053 回答
5

您声明了一个可以容纳 10000001 个项目的数组;如果要处理更大的数字,则需要更大的数组。我有点惊讶它已经适用于 1000000 - 这是要使用的大量堆栈空间。

编辑:对不起 - 没有注意到你那里有不同数量的零。不要使用堆栈来分配你的数组,你应该没问题。只需添加static到数组声明中,您可能会没事的。

于 2013-08-29T21:04:44.940 回答