可能是一个愚蠢的,经常被问到的错误,涉及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数组被修改.我尝试使用指针代替相同的结果,也尝试过 任何帮助将不胜感激. 解决方法
你错误地索引到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),在其他数据上写(这就是你所看到的),或删除你所有的文件(我知道没有编译器实际上这样做).实际上,编译器可以完全自由地在发生未定义的行为时产生尽可能多的破坏,并且当您访问越界数组索引时就会出现这种情况. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |