我不明白为什么打印这个程序:
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
变量,但这仅仅是一部分更大的代码,请忽略它。
答案 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];