我已经为sieven编写了代码,但是程序只运行小于或等于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;
    }

最佳答案

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

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

如果以每个4字节分配10000000个条目,即4000万字节,这将超出堆栈的处理能力。
(或者,在您的平台上,很有可能一个长整型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!

10-07 13:34