下面是一个绘制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);
}
答案 0 :(得分:4)
问题 你不使用指针。当N
为1022
时,变量M
的大小将为8355872字节,例如Linux默认的进程堆栈空间(存储局部变量)是8MB(即当M
为1022时,只比矩阵N
所需的空间多一点)。
其他平台的默认堆栈大小更小(Windows,使用VC ++编译器,默认只有1MB)。
有两种方法可以解决这个问题:创建数组和矩阵(em)全局变量(然后它们将不再存在于堆栈中),或使用指针并分配动态地离开堆。