加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:33:04 所属栏目:百科 来源:网络整理
导读:我是C的新手,我遇到以下问题.我初始化数组: double Cx[101];for(int i=0; i101; 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
我是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 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,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再次发生变化.

任何帮助将不胜感激.

解决方法

你错误地索引到Q. C中的数组索引从0开始,而不是1.所以你应该有

double g=1;
double dx=0.1;
for(int i=0; i<101; i++){
  Q[0][i] = InitHeight(g,Cx[i]); /* Used to be Q[1][i] */
  Q[1][i] = InitMom(g,Cx[i]); /* Used to be Q[2][i] */
  y[i] = plainTopo(Cx[i]);
}

至于为什么Cx会被更改,访问数组中的越界项会导致未定义的行为,这意味着C编译器可以执行任何感觉.您的特定编译器会为Cx生成赋值.从技术上讲,这是因为数组在堆栈上的布局方式,但编译器不需要执行与编译器相同的操作,而是可以选择导致程序崩溃(这是最好的情况,因为它可以帮助你找到bug),在其他数据上写(这就是你所看到的),或删除你所有的文件(我知道没有编译器实际上这样做).实际上,编译器可以完全自由地在发生未定义的行为时产生尽可能多的破坏,并且当您访问越界数组索引时就会出现这种情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读