为什么我运行程序之后会停止工作?是溢出了吗?

AlanChan09 2016-05-14 10:18:16
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

FILE *output;

int numx = 100;
int numy = 100;
int numz = 100;
int numt = 20000;

int i = 0, j = 0, k = 0, m = 0;
double x = 0.0, y = 0.0, z = 0.0, t = 0.0;

double space_step = 20 / (numx);
double time_step = 0.002;

double C_coef = time_step / pow(space_step,2);


void boundary(){
double C[numx][numy][numz];

for(k = 0; k < numz; k++){
for(i = 0; i < numx; i++){
C[i][0][k] = 0.1; C[i][numy-1][k] = 0.1;
C[0][i][k] = 0.1; C[numx-1][i][k] = 0.1;
for(j = 0; j < numy; j++){
C[i][j][numz-1] = 0.1;}
}
}
}


int main (){
double C[numx][numy][numz];
double New_C[numx][numy][numz];
double C_diffuse;

output = fopen("C_3d.txt", "w");

for(i = 0; i < numx; i++)
for(j = 0; j < numy; j++)
for(k = 0; k < numz; k++){

C[i][j][k] = 0;
C[numx/2][numy/2][0] = 100;
}


for(m = 0; m < numt; m++){

for(i = 1; i < numx-1; i++)
for(j = 1; j < numy-1; j++)
for(k = 1; k < numz-1; k++){

C_diffuse = C_coef * (C[i+1][j][k] + C[i-1][j][k] +\
C[i][j+1][k] + C[i][j-1][k] +\
C[i][j][k+1] + C[i][j][k-1] - 6 * C[i][j][k]);

New_C[i][j][k] = C[i][j][k] + C_diffuse;

}

for(i = 1; i < numx-1; i++)
for(j = 1; j < numy-1; j++)
for(k = 1; k < numz-1; k++){

C[i][j][k] = New_C[i][j][k];

}

boundary();

C[numx/2][numy/2][0] = 100;

}

for(i = 0; i < numx; i++)
for(j = 0; j < numy; j++)
for(k = 0; k < numz; k++){

x = i * space_step; y = j * space_step; z = k * space_step; t = m * time_step;

fprintf(output, "%f\t%f\t%f\t%f\t%f\n", t, x, y, z, C[i][j][k]);
}
fflush(output);
fclose(output);

return 0;
}

算是一个比较简单的三维扩散计算,为什么运行时会显示程序停止工作?
是溢出了吗?
小白一个,还请各位指点一下。(我用codeblocks编写的程序)
...全文
369 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlanChan09 2016-05-19
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
十分感谢,你的回答对我很有帮助,之前只是拿C语言做一些数值计算类的,现在还需要继续学习。
AlanChan09 2016-05-19
  • 打赏
  • 举报
回复
引用 11 楼 qq423399099 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
谢谢,一直在努力。
707wk 2016-05-15
  • 打赏
  • 举报
回复
加几个输出语句排查一下程序是在哪块停止的
AlanChan09 2016-05-15
  • 打赏
  • 举报
回复
引用 4 楼 sds428 的回复:
我也是新手,学习中,呵呵,不知道可否,malloc,或,new,那东西在堆中吧,可以搞的很大的,或,全局的呢,具体我也不清楚了,共同学习
我再试试
AlanChan09 2016-05-15
  • 打赏
  • 举报
回复
引用 6 楼 wenpinglaoyao 的回复:
楼主,我不明白您的程序代码是怎么通过编译的。比如,在第36行的代码【double C[numx][numy][numz];】这块,在栈上声明一个数组时,数组的大小应该是编译期就能确定的啊,但您代码里面的numx等明显不是常量啊,怎么可能编译通过呢?
这样子在vc上的确编译不通过,但是在codeblocks上是可以编译通过的。
AlanChan09 2016-05-15
  • 打赏
  • 举报
回复
引用 5 楼 paschen 的回复:
出错时点中断,通过调用堆栈、变量窗口等观察分析出错原因,必要时单步跟踪程序运行,特别注意检查是否越界
好,我再试试
赵4老师 2016-05-15
  • 打赏
  • 举报
回复
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
小灸舞 版主 2016-05-15
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
sds428 2016-05-14
  • 打赏
  • 举报
回复
我也是新手,学习中,呵呵,不知道可否,malloc,或,new,那东西在堆中吧,可以搞的很大的,或,全局的呢,具体我也不清楚了,共同学习
sds428 2016-05-14
  • 打赏
  • 举报
回复
double C[numx][numy][numz];中8*100*100*100是不是有点大了,是约8M空间吗?(呵呵,不太清楚,是不是这样计算的)如是的话,局部变量申请这大,运行时,肯定过不了吧
AlanChan09 2016-05-14
  • 打赏
  • 举报
回复
引用 1 楼 sds428 的回复:
刚放入vc6下跑了下,把类似于double C[numx][numy][numz];这些改为double C[100][100][100];等,就可以编译通过,但运行也会崩的,但把100改为10,20000改为20,就可以运行通过了,
谢谢,但是我需要的最小值就是100和20000,小一点的数值,我跑起来也会通过,那么这种情况是算溢出了吗?需要怎么改?我用的codeblocks,电脑win10 vc6不能运行。
sds428 2016-05-14
  • 打赏
  • 举报
回复
刚放入vc6下跑了下,把类似于double C[numx][numy][numz];这些改为double C[100][100][100];等,就可以编译通过,但运行也会崩的,但把100改为10,20000改为20,就可以运行通过了,
纹枰老妖 2016-05-14
  • 打赏
  • 举报
回复
楼主,我不明白您的程序代码是怎么通过编译的。比如,在第36行的代码【double C[numx][numy][numz];】这块,在栈上声明一个数组时,数组的大小应该是编译期就能确定的啊,但您代码里面的numx等明显不是常量啊,怎么可能编译通过呢?
paschen 2016-05-14
  • 打赏
  • 举报
回复
出错时点中断,通过调用堆栈、变量窗口等观察分析出错原因,必要时单步跟踪程序运行,特别注意检查是否越界

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧