我已经为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!