这是SPOJ(Sphere在线判断)上的Prime Generator问题的解决方案,我已经检查过没有数组超出范围,但仍显示运行时错误。
#include <stdio.h>
int main(){
int n;
int i,j,a,b;
scanf("%d", &n);
while(n){
scanf("%d %d", &a, &b);
int arr[b];
// Filling the array
for(i=2;i<=b;i++){
arr[i-2]=i;
}
int p,c;
for(p=0;p<b-1;p++){
if(arr[p]){
if(arr[p]>=a){
printf("\n%d", arr[p]);
}
for(c=p+arr[p];c<b-2;c+= arr[p]){
arr[c]=0;
}
}
}
n--;
}
答案 0 :(得分:2)
问题在于这个宣言:
int arr[b];
这会尝试在堆栈上分配4· b 字节的内存。堆栈大小通常限制为几兆字节的内存,但对于较大的测试用例,判断工具将使用 b = 1000000000来调用您的程序,这会导致程序分配4 GB的内存堆栈。这比你可以放在堆栈上的更多,导致你观察到的SIGSEGV。
要解决此问题,请使用malloc()
分配arr
,而不是声明可变长度数组。通过malloc()
分配的内存来自堆,它可以增长到操作系统允许的大小,通常直到所有内存耗尽并可能进一步。
您还应考虑实施不同的算法来解决此问题。有一些素数测试比你实施的Eratosthenes的天真筛子更有效。