为什么这个for循环改变了变量的值?

时间:2018-05-11 19:31:10

标签: c

我不明白为什么打印这个程序:

mat[2][0] is -1.824069168023063

我想要打印:

mat [2][0] is 0.055539784445602

我知道错误发生在第2个第3个for循环中,但我不明白为什么会这样。

#include <math.h>
#include <stdio.h>

int main ()
{
    int i = 0, n, s = 0, t = 0, j = 0;

    n=2;
    double x[n+1], y[n+1];  
    double mat[n + n - 1][n];
    y[0]=2.2;
    y[1]=2.3;
    y[2]=2.4;
    x[0]=0.110362266922174;
    x[1]=0.055539784445602;
    x[2]=0.002507683297244; 

    for (i = 0; i <= n ; i++)
    {
        mat[s][0] = x[i];
        mat[s][1] = y[i];
        printf ("mat %d 0 is %.15lf\n", s, mat[s][0]);
        printf ("mat %d 1 is %.15lf\n", s, mat[s][1]);
        s = s + 2;
    }

    for (i = 1; i <= n; i++)
    {
        t = i;
        for (j = 0; j <= n - i; j++)
        {
            mat[t][i + 1] = (mat[t + 1][i] - mat[t - 1][i]) / (mat[t + i][0] - mat[t - i][0]);
            printf ("mat[%d][%d] is %.15lf\n", t, i + 1, mat[t][i + 1]);
            t = t + 2;
        }
    }

    printf("mat[2][0] is %.15lf",mat[2][0]);

    return 0;
}

我知道没有必要在这里使用n,我可以使用n=3而不使用n作为int变量,但这仅仅是一部分更大的代码,请忽略它。

1 个答案:

答案 0 :(得分:2)

问题是你要在数组末尾写字。

您分配:

double mat[n + n - 1][n];

n=2起,这意味着每行有两列,[0][1]

因此,当您写信至mat[1][2]时,该信息已超过mat[1]的结尾。这是未定义的行为,所以它可以做任何事情,从segfaulting到花费你的全部储蓄在一个匆匆的骗局加密货币。但是,由于数组在您的系统上的分配方式,mat[2]在内存中mat[1]后立即结束,没有间隙,因此对mat[1][2]的写入进入mat[2][0] }。

您的代码也可以写入[3],实际上也是mat[2][3],因为您正在循环i <= n并写信给mat[t][i+1]。< / p>

你还没有解释这些值应该是什么意思,而且我很难猜测(例如,什么是j循环,当你甚至没有在其中使用j?),因此我无法告诉您如何修复代码以执行您想要执行的操作。

但是我可以猜测,基于你调用事物mat的事实,你可能想要一个方阵。在这种情况下,修复可能就像这样简单:

double mat[n + n - 1][n + n - 1];

但即使这样也不正确,因为n + n - 1是3,而mat[2][3]仍会写到结尾。所以也许你真的想要这个:

double mat[n + n][n + n];