繁体   English   中英

为什么此for循环会更改变量的值?

[英]Why does this for loop change the value of a variable?

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

mat[2][0] is -1.824069168023063

我要打印:

mat [2][0] is 0.055539784445602

我知道错误在2nd-3rd 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变量,但这只是较大代码的一部分,因此请忽略它。

问题是您正在写超出数组末尾的位置。

您分配:

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

由于n=2 ,这意味着每一行都有两列[0][1]

因此,当您写入mat[1][2]时,已经超出了mat[1]的末尾。 这是未定义的行为,因此它可以执行任何操作,从分段错误到将您的全部积蓄花在按夜行销骗局加密货币上。 但是,由于数组是在系统上分配的,因此mat[2]在内存中的mat[1]之后立即结束,没有间隙,因此对mat[1][2]的写入将进入mat[2][0]

您的代码也可以写入[3] ,实际上也可以在mat[2][3]写入,因为您要遍历i <= n并写入mat[t][i+1]

您没有解释这些值的含义,而且我很难猜测(例如,即使您从未使用过jj循环的作用是什么),所以我可以不能肯定地告诉您如何修改代码以执行所需的操作。

但是我可以猜到,基于您称事物mat的事实,也许您想要一个正方形矩阵。 在这种情况下,修复可能很简单:

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

但是,即使那也不正确,因为n + n - 1为3,并且mat[2][3]仍会写到末尾。 所以也许您实际上想要这样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM