我已经编写了筛子的代码,但程序只运行小于或等于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;
}
答案 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
添加到数组声明中,您就可以了。