我编写了以下代码,用于打印数组。但是当输入非常大时,例如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;
}
答案 0 :(得分:1)
可能是堆栈溢出的问题。基于堆栈的数组k
,p
,d
和A
将需要:
40000 x (1 + 1 + 1 + 3) x 8 = 1920000 bytes
E.g。大约两兆字节。默认的最大堆栈大小通常为1兆字节。
参见例如http://msdn.microsoft.com/en-us/library/tdkhxaks.aspx或Change stack size for a C++ application in Linux during compilation with GNU compiler或Getting a stack overflow exception when declaring a large array。
答案 1 :(得分:0)
如果您使用C(而不是C ++)进行编程,则在程序中间声明变量可能会给您带来问题。尝试使用malloc()来制作动态数组。
我能看到的另一个问题是下一句话:
A[J-2][2]=0.0;
如果J = 1,例如它会给你带来问题,因为索引将低于0。