【问题标题】:when the input is very large I get Segmentation fault [duplicate]当输入非常大时,我得到分段错误 [重复]
【发布时间】:2014-01-24 12:35:36
【问题描述】:

我编写了以下代码,它打印一个数组。但是当输入非常大时,例如 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;
}

【问题讨论】:

    标签: c arrays stack


    【解决方案1】:

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

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

    例如大约两兆字节。默认的最大堆栈大小通常为 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

    【讨论】:

    • 我明白了...谢谢!!!
    【解决方案2】:

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

    我可以看到的另一个问题是在下一句中:

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

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

    【讨论】:

    • 好的!以及如何将 malloc() 用于二维数组?
    • malloc() 以字节数保留内存。不管是一维、二维还是三维。例如,如果要声明:double A[J-1][3];您将拥有 (J-1)*3 个字节。所以你必须使用: double *A; A=malloc((J-1)*3);并且您将能够根据需要使用它(在本例中为二维数组)
    • 好的!非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2012-01-01
    相关资源
    最近更新 更多