gpt4 book ai didi

c - 当我使用 N=1023 而不是 1024 时,为什么在下面的程序中会出现段错误(核心已转储)?

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:28 25 4
gpt4 key购买 nike

下面是一个绘制 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);

}

最佳答案

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

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


有两种方法可以解决这个问题:要么让你的数组和矩阵成为全局变量(然后它们将不再在堆栈上),要么使用指针并分配动态脱离堆。

关于c - 当我使用 N=1023 而不是 1024 时,为什么在下面的程序中会出现段错误(核心已转储)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25398727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com