为什么我在以下c程序中得到分段错误

时间:2014-10-23 13:38:49

标签: c segmentation-fault

以下代码编译成功但我在main函数的第一行得到了Segmentation错误。我不知道为什么我会收到这个错误。

#include <stdio.h>
#include <math.h>
unsigned int prime=2;

void resetprimegenerator()
{
    prime=2;
}

unsigned int getnextprime()
{
    while(1)
    {
        if(isprime(prime))
            return prime;
    }

}

int isprime(unsigned int n)
{
    int i=3,check=1;
    if(n==2)
        return n;
    for(i=3;i<=sqrt(prime);i+=2)
    {
        if(prime%i==0)
        {
            check=0;
            break;
        }
    }
    return check;
}
int main()
{
    int t,n,i=0,j=0;
    int input[500];
    unsigned int answer[500][5000];
    scanf("%d",&t);
    getchar();
    while(t-->0)
    {
        scanf("%d",&input[i]);
        getchar();
        n=input[i];
        j=0;
        resetprimegenerator();
        while(n-->0)
        {
            answer[i][j]=getnextprime();
            j++;
        }
        i++;
    }
    for(i=0;i<t;i++)
    {
        for(j=0;j<input[i];j++)
        {
            if(j==input[i]-1)
                printf("%u",answer[i][j]);
            else
                printf("%u ",answer[i][j]);
        }
    }
    return 0;
}

我无法理解为什么会收到以下错误。

2 个答案:

答案 0 :(得分:7)

unsigned int answer[500][5000];

假设unsigned int是4个字节,此变量将占用大约10MB的堆栈大小。这比正常堆栈的大小要大,你所拥有的是stack overflow

解决方案是使用动态分配,或使其为全局/静态。根据您的需要选择。

答案 1 :(得分:4)

声明

时,您的堆栈空间不足
unsigned int answer[500][5000];

相反,在堆上分配它;使用malloc()。

例如,您可以使用指向数组的指针:

int ( *array )[5000] = malloc( sizeof( *array ) * 500 ) ;

array[0][0] = 1234 ;

其中sizeof( *array )的值等于sizeof(int) * 5000