C++ 仅当未打印到屏幕时才会发生分段错误

C++ 仅当未打印到屏幕时才会发生分段错误,c++,c,C++,C,我试图用正向差分法来求解热方程,但是我的代码在第13次迭代中总是出现分段错误。因此,我通过将一些printf插入循环并检查一些变量的值来进行调试。一旦我坚持在printf的,我的循环成功地继续过去的故障点之前。然而,如果我只是注释掉那些printf,代码将再次出错。。。有人知道为什么会这样吗 ///////////////////////////////////////////////////////////// // // Math 448 Assignment 5 Gaus

我试图用正向差分法来求解热方程,但是我的代码在第13次迭代中总是出现分段错误。因此,我通过将一些printf插入循环并检查一些变量的值来进行调试。一旦我坚持在printf的,我的循环成功地继续过去的故障点之前。然而,如果我只是注释掉那些printf,代码将再次出错。。。有人知道为什么会这样吗

/////////////////////////////////////////////////////////////
//
//          Math 448 Assignment 5 Gauss-Seidel
//
/////////////////////////////////////////////////////////////
#include <stdio.h>
#include <iostream>
#include <math.h>

#define I 9
#define J 100
#define M 10


double w[M][J] = {0};
double v[M] = {0};
double K = 0.005;
double H = 0.1;

// J is time, t
// I is distance, x

int main(void){

    // First build up t=0
    int i,j;
    double lambda;
    double t = 0;

        printf("k=%lf\th=%lf\n", K, H);
    lambda = (0.5)*(double)K/(H*H);

    for(i=0;i<=M-1;i++){
        if(i<=5)
        {
            w[i][0] = i*H;
        }else{
            w[i][0] = (double)(1-i*H);
        }
    }

    printf("lam=%lf\n",lambda);

    for(j=1;j<=J;j++){
        v[0] = 0;
        v[I-1] = 0;

        for(i=1;i<=M-1;i++){
            if(t>=0.06){
                            // THESE ARE THE PRINTS THAT CAUSE IT TO WORK
                //printf("i=%d\n1) %lf\n2) %lf\n3) %lf\n",i, w[i-1][j-1], w[i][j-1], w[i+1][j-1]);
                //getchar();
            }
            v[i] = lambda*w[i-1][j-1] + (1-2*lambda)*w[i][j-1] + lambda*w[i+1][j-1];

        }

        t = j*K;
        printf("t=%.4lf\t",t);
        for(i=0;i<M;i++){
            printf("%.4lf\t", v[i]);
        }

        for(i=1;i<M-1;i++){
            w[i][j] = v[i];
        }

        printf("\n");

    }


    /*
            //Psuedocode
        for j=1 to N
            v0 = 0
            vm = 0
            for i=1 to m-1
                vi = LAM*Wi-1 + (1-2LAM)*Wi + LAM*Wi+1
                end for
            t = i*k
            output(v0, v1, v2...)
        end for
    */
    return 0;
}
/////////////////////////////////////////////////////////////
//
//数学448作业5高斯赛德尔
//
/////////////////////////////////////////////////////////////
#包括
#包括
#包括
#定义I 9
#定义J 100
#定义M 10
双w[M][J]={0};
双v[M]={0};
双K=0.005;
双H=0.1;
//J是时间,t是时间
//I是距离,x
内部主(空){
//首次累积t=0
int i,j;
双λ;
双t=0;
printf(“k=%lf\th=%lf\n”,k,H);
λ=(0.5)*(双)K/(H*H);

对于(i=0;i您正在尝试访问
j==j
的数组边界外的插槽。索引在
0…j-1
范围内。

就在这里:

for(j=1;j<=J;j++)

for(j=1;jMemory corrupt.你试过运行valgrind吗?看起来这超出了范围
w[i][j]=v[i];
因为
j
可以上升到值
j
w[i+1]超出范围,当i=M-1,第54行,cppcheck说