可能是一个愚蠢的,经常被问到的错误,涉及C中的数组

时间:2013-03-21 22:28:39

标签: c

我是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再次发生变化。

任何帮助都会非常感激。

4 个答案:

答案 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>数组的维度。