当我使用N = 1023而不是1024时,为什么我在下面的程序中遇到分段错误(核心转储)?

时间:2014-08-20 07:08:44

标签: c segmentation-fault

下面是一个绘制2D高斯的简单程序,对于N = 1022及以下程序工作正常,但是对于N = 1023和更高我得到分段错误(核心转储),我错过了什么?

我没有在任何地方使用指针,除了写数据文件

#include<stdio.h>
#include<math.h>

void main()
{
    int i, j;
    int N;
    N=1022;
    //Why will i get a segmentation fault if i use 1023 instead of 1024?
    double M[N][N];
    double x[N];
    double y[N];
    double xmax,ymax;
    double dx,dy;
    FILE *fp1,*fp2;
    fp2=fopen("strtfn.txt","w+");

    xmax=10;
    dx=(2*xmax)/N;
    for(i=0; i<N; i++)
    {
        x[i]=-xmax+(i*dx);
    }
    ymax=10;
    dy=(2*ymax)/N;
    for(i=0; i<N; i++)
    {
        y[i]=-ymax+(i*dy);
    }

    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            M[i][j]=exp(-x[i]*x[i]/10./10.)*exp(-y[j]*y[j]/10./10.);
            fprintf(fp2,"%lf\t%lf\t%lf\n",x[i],y[j],M[i][j]);
        }
    // printf("\n");
    }

    fclose(fp2);

}

1 个答案:

答案 0 :(得分:4)

问题 你不使用指针。当N1022时,变量M的大小将为8355872字节,例如Linux默认的进程堆栈空间(存储局部变量)是8MB(即当M为1022时,只比矩阵N所需的空间多一点)。

其他平台的默认堆栈大小更小(Windows,使用VC ++编译器,默认只有1MB)。


有两种方法可以解决这个问题:创建数组和矩阵(em)全局变量(然后它们将不再存在于堆栈中),或使用指针并分配动态地离开堆。

相关问题