为什么我得到以下代码的运行时错误(SIGSEGV)?

时间:2016-02-17 10:12:12

标签: c

这是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--;    
    }

1 个答案:

答案 0 :(得分:2)

问题在于这个宣言:

int arr[b];

这会尝试在堆栈上分配4· b 字节的内存。堆栈大小通常限制为几兆字节的内存,但对于较大的测试用例,判断工具将使用 b = 1000000000来调用您的程序,这会导致程序分配4 GB的内存堆栈。这比你可以放在堆栈上的更多,导致你观察到的SIGSEGV。

要解决此问题,请使用malloc()分配arr,而不是声明可变长度数组。通过malloc()分配的内存来自,它可以增长到操作系统允许的大小,通常直到所有内存耗尽并可能进一步。

您还应考虑实施不同的算法来解决此问题。有一些素数测试比你实施的Eratosthenes的天真筛子更有效。