我是C的新手,我遇到以下问题。我初始化数组:
double Cx[101];
for(int i=0; i<101; i++){
Cx[i]=-5+i*0.1;
}
double Q[2][101];
double y[101];
我在main方法之外有以下功能:
double InitHeight(double g, double dx, double x){
return 3;
}
double InitMom(double g, double dx, double x){
return 2;
}
double plainTopo(double x){
return x*10;
}
现在,在主要方法中,我执行以下操作:
double g=1;
double dx=0.1;
for(int i=0; i<101; i++){
Q[1][i] = InitHeight(g,dx,Cx[i]);
Q[2][i] = InitMom(g,dx,Cx[i]);
y[i] = plainTopo(Cx[i]);
}
所以,我的问题是Cx数组的原始值被修改。这是原始Cx的一部分:
-5.000000
-4.900000
-4.800000
-4.700000
-4.600000
-4.500000
-4.400000
...
在我运行代码后,这就是我得到的:
Cx[] Q[1][] Q[2][] y[]
2.000000 3.000000 2.000000 20.000000
2.000000 3.000000 2.000000 20.000000
2.000000 3.000000 2.000000 20.000000
2.000000 3.000000 2.000000 20.000000
2.000000 3.000000 2.000000 20.000000
2.000000 3.000000 2.000000 20.000000
我不能为我的生活看到为什么Cx数组被修改。我尝试使用指针代替相同的结果,也尝试过 double x = Cx [i] 在循环中,然后将x传递给函数,但Cx再次发生变化。
任何帮助都会非常感激。
答案 0 :(得分:6)
您错误地将Q
编入索引。 C中的数组索引从0开始,而不是1.所以你应该有
double g=1;
double dx=0.1;
for(int i=0; i<101; i++){
Q[0][i] = InitHeight(g,dx,Cx[i]); /* Used to be Q[1][i] */
Q[1][i] = InitMom(g,dx,Cx[i]); /* Used to be Q[2][i] */
y[i] = plainTopo(Cx[i]);
}
至于为什么Cx
被更改,访问数组中的越界项会导致未定义的行为,这意味着C编译器可以执行任何感觉。您的特定编译器会将分配生成到Cx
。从技术上讲,这是因为数组在堆栈上的布局方式,但是编译器不需要执行与编译器相同的操作,而是可以选择导致程序崩溃(这是最好的情况,因为它可以帮助你找到bug),在其他数据上写(这就是你所看到的),或删除你的所有文件(我知道没有编译器实际上这样做)。实际上,编译器具有完全自由,以便在发生未定义的行为时产生尽可能多的破坏,并且当您访问越界数组索引时就会出现这种情况。
答案 1 :(得分:5)
这超出了数组Q
的范围,导致未定义的行为:
Q[1][i] = InitHeight(g,dx,Cx[i]);
Q[2][i] = InitMom(g,dx,Cx[i]);
必须为Q[0]
且Q[1]
,Q
定义为:
double Q[2][101];
代码中的其他索引表明您知道数组索引从零开始并从0
运行到N - 1
,其中N
是数组中元素的数量。< / p>
答案 2 :(得分:1)
double g=1;
double dx=0.1;
for(int i=0; i<101; i++){
Q[1][i] = InitHeight(g,dx,Cx[i]);
Q[2][i] = InitMom(g,dx,Cx[i]);
y[i] = plainTopo(Cx[i]);
}
你没有Q [2] [i],所以它可能会覆盖你的Cx阵列
我认为你的意思是
Q[0][i] = InitHeight(g,dx,Cx[i]);
Q[1][i] = InitMom(g,dx,Cx[i]);
答案 3 :(得分:1)
double Q[2][101];
:
Q[2][i] = InitMom(g,dx,Cx[i]);
你的腐败正在发生,因为Q的合法索引不包括Q[2][...]
。
你似乎知道这一点,因为你为i
数组从0到100迭代Cx[101]
所以它似乎只是一个暂时的错误 - 它与 all <的规则相同/ em>数组的维度。