[英]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]
。
您没有解释这些值的含义,而且我很难猜测(例如,即使您从未使用过j
, j
循环的作用是什么),所以我可以不能肯定地告诉您如何修改代码以执行所需的操作。
但是我可以猜到,基于您称事物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.