user-0 提问: 计算三维数组并输出txt文件崩溃

回复:
user: user-1
content: 引用 12 楼 qq_36738327 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] static  double u[Nx][Ny][Nt]={0},v; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 #11亲测有效，学习了，非常感谢[/quote] Who am I！

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:static  double u[Nx][Ny][Nt]={0},v; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 #11亲测有效，学习了，非常感谢

user: user-1
content: static  double u[Nx][Ny][Nt]={0},v; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-0
content: 没找到回复功能。。。只好直接引用楼号 #2：那个不好意思，我上过的C课程讲得比较初级，不了解栈溢出 #4#5：非常感谢，我会尝试一下 #6：这个是我的疏忽，拷贝matlab代码修改时不小心删多了，那个其实是Nx/2 #7：这个是我改代码时的问题，之前一直用matlab，下标是从1开始的，改成C时只考虑了前面的下标对后面没考虑充足 非常感谢以上几位的帮助，下面附上修改过错误的代码，我会尝试#4#5提供的方法是否能使程序崩溃情况消失。  #include<stdio.h> #include<math.h> #define xp 400 #define y1 100 #define y2 200 #define yp y1+y2 #define v1 200 #define v2 400 #define tp 0.75 #define dx 1 #define dy 1 #define dt 0.001 #define Nx 400 #define Ny 300 #define Nt 750 #define f 50 #define pi 3.14159 #define a v*dt/dx #define b dt*v #define Ric (1-2*(pi*f*k*dt)*(pi*f*k*dt))*exp(-(pi*f*k*dt)*(pi*f*k*dt)) void main() { 	int i,j,k; 	double u[Nx][Ny][Nt]={0},v; 	for(k=1;k<Nt-1;k++) 	{ 		for(j=1;j<Ny-1;j++) 		{ 			for(i=1;i<Nx-1;i++) 			{ 				if((i==Nx/2)&&(j==1)) 				{ 					if(j<=(y1/dy)) 					{ 						v=v1; 						u[i][j][k+1]=a*a*(u[i+1][j][k]+u[i-1][j][k]+u[i][j+1][k]+u[i][j-1][k])+2*(1-2*a*a)*u[i][j][k]-u[i][j][k-1]+b*b*Ric; 					} 					else 					{ 						v=v2; 						u[i][j][k+1]=a*a*(u[i+1][j][k]+u[i-1][j][k]+u[i][j+1][k]+u[i][j-1][k])+2*(1-2*a*a)*u[i][j][k]-u[i][j][k-1]+b*b*Ric; 					 					} 				} 				else 				{ 					if(j<=(y1/dy)) 					{ 						v=v1; 						u[i][j][k+1]=a*a*(u[i+1][j][k]+u[i-1][j][k]+u[i][j+1][k]+u[i][j-1][k])+2*(1-2*a*a)*u[i][j][k]-u[i][j][k-1]; 					} 					else 					{ 						v=v2; 						u[i][j][k+1]=a*a*(u[i+1][j][k]+u[i-1][j][k]+u[i][j+1][k]+u[i][j-1][k])+2*(1-2*a*a)*u[i][j][k]-u[i][j][k-1]; 					 					}  				} 			} 		} 	} 	FILE *fp; 	fp=fopen("D:\\u.txt","w"); 	for(i=0;i<Nx;i++) 	{ 		for(j=0;j<Ny;j++) 		{ 			for(k=0;k<Nt;k++) 			{ 				fprintf(fp,"%f ",u[i][j][k]); 			} 		} 	} 	fclose(fp); }

user: user-2
content: 引用 8 楼 zhao4zhong1 的回复:5楼请注意，这是C语言论坛。new不属于C语言。  没注意这个，非要用纯C语言的话，那楼主就用malloc或者calloc吧。

user: user-1
content: 5楼请注意，这是C语言论坛。new不属于C语言。

user: user-2
content: if(j<=(y1/dy)) 					{ 						v=v1; 						u[i][j][k+1]=a*a*(u[i+1][j][k]+u[i-1][j][k]+u[i][j+1][k]+u[i][j-1][k])+2*(1-2*a*a)*u[i][j][k]-u[i][j][k-1]; 					} 					else 					{ 						v=v2; 						u[i][j][k+1]=a*a*(u[i+1][j][k]+u[i-1][j][k]+u[i][j+1][k]+u[i][j-1][k])+2*(1-2*a*a)*u[i][j][k]-u[i][j][k-1]; 					 					}  再有一个隐患就是： 循环里用k+1做下标，循环还用for(k=1;k<Nt;k++)，一旦k=Nt-1时，k+1就是Nt，u[i][j][Nt]，这不是数组越界吗？  这是运行隐患。在用循环变量在循环中做线性增减时，务必判断线性增长的值是否还在数组下标范围内。  楼主还要多多练习啊。代码经历还是太年轻。

user: user-2
content: for(i=1;i<Nx;i++) { 	if((i==Nx)&&(j==1))  再有你写的一个废话代码： 你代码里的这句永远不会是true，你的i永远小于Nx，怎么可能还会有i==Nx的机会呢？ i刚等于Nx时，立刻被i<Nx;条件判断出，从而退出循环。

user: user-2
content: //动态定义三维数组：   double *** u;   u = new double**[Nx] ;   for( i = 0 ; i < Nx ; i ++ )   { 	u[i] = new double*[Ny] ; } for( i = 0 ; i < Nx ; i ++ )   { 	for( j = 0 ; j < Ny ; j ++ )   	{ 		u[i][j] = new double[Nt] ; 	} } //输入三维数组值：   for(i = 0 ; i < Nx ; i ++ )   { 	for(j = 0 ; j < Ny ; j ++ )   	{ 		for( k = 0 ; k < Nt ; k ++)   		{ 			u[i][j][k] = 0.f; 		} 	} }

user: user-1
content: 仅供参考：//在堆中开辟一个3×4×5的3维int数组 #include <stdio.h> #include <malloc.h> int ***p; int i,j,k; void main() {     p=(int ***)malloc(3*sizeof(int **));     if (NULL==p) return;     for (i=0;i<3;i++) {         p[i]=(int **)malloc(4*sizeof(int *));         if (NULL==p[i]) return;         for (j=0;j<4;j++) {             p[i][j]=(int *)malloc(5*sizeof(int));             if (NULL==p[i][j]) return;         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 p[i][j][k]=i*20+j*5+k;             }         }     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             for (k=0;k<5;k++) {                 printf(" %2d",p[i][j][k]);             }             printf("\n");         }         printf("---------------\n");     }     for (i=0;i<3;i++) {         for (j=0;j<4;j++) {             free(p[i][j]);         }         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //--------------- // 20 21 22 23 24 // 25 26 27 28 29 // 30 31 32 33 34 // 35 36 37 38 39 //--------------- // 40 41 42 43 44 // 45 46 47 48 49 // 50 51 52 53 54 // 55 56 57 58 59 //---------------

user: user-3
content: 单步调试下.

user: user-2
content: 开这么大数组，栈溢出了，不知道吗？ 3维，400*300*750，超出了栈内存的大小。

user: user-0
content: 1>------ 已启动生成: 项目: Ric, 配置: Debug Win32 ------ 1>  test01.c 1>e:\vc test\ric\ric\test01.c(85): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1>  c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt\stdio.h(205): note: 参见“fopen”的声明 1>  Ric.vcxproj -> E:\vc test\Ric\Debug\Ric.exe 1>  Ric.vcxproj -> E:\vc test\Ric\Debug\Ric.pdb (Full PDB) ========== 生成: 成功 1 个，失败 0 个，最新 0 个，跳过 0 个 ==========