当输入非常大时,我得到Segmentation故障

时间:2014-01-06 23:24:03

标签: c arrays stack

我编写了以下代码,用于打印数组。但是当输入非常大时,例如J = 40000,我得到分段错误。你能告诉我为什么会这样吗?这是因为数组的维数太大,还是我做错了什么?

    int main(){

    int i,j,J;
    printf("Give the number J: \n");
    scanf("%d", &J);

    double k[J-1];
    double d[J-1];
    double p[J-1];
    double A[J-1][3];       
    double h=1.0/(double)J;

    for(j=0; j<J-1; j++){
        k[j]=-1.0/(h*h);
        d[j]=2.0/(h*h);
        p[j]=-1.0/(h*h);
  }


  for(j=0; j<J-1; j++){
        A[j][0]=k[j];
        A[j][1]=d[j];
        A[j][2]=p[j];
    }


    A[0][0]=0.0; 
    A[J-2][2]=0.0;

    for(j=0; j<J-1; j++){
      for(i=0; i<3; i++){
        printf("%lf  ",A[j][i]);
    }
    printf("\n\n");
}
return 0;
}

2 个答案:

答案 0 :(得分:1)

可能是堆栈溢出的问题。基于堆栈的数组kpdA将需要:

40000 x (1 + 1 + 1 + 3) x 8 = 1920000 bytes

E.g。大约两兆字节。默认的最大堆栈大小通常为1兆字节。

参见例如http://msdn.microsoft.com/en-us/library/tdkhxaks.aspxChange stack size for a C++ application in Linux during compilation with GNU compilerGetting a stack overflow exception when declaring a large array

答案 1 :(得分:0)

如果您使用C(而不是C ++)进行编程,则在程序中间声明变量可能会给您带来问题。尝试使用malloc()来制作动态数组。

我能看到的另一个问题是下一句话:

    A[J-2][2]=0.0;

如果J = 1,例如它会给你带来问题,因为索引将低于0。