当int变量在循环内更新时,C代码不起作用
我对C编程有点陌生,有一段时间没做任何事情了。我试图对一个函数进行简单的数值积分。 以下是我的代码的简化版本:当int变量在循环内更新时,C代码不起作用,c,loops,variables,C,Loops,Variables,我对C编程有点陌生,有一段时间没做任何事情了。我试图对一个函数进行简单的数值积分。 以下是我的代码的简化版本: int main() { /*Constants----*/ double e0=8.85E-12; //C^2/Nm^2 double e_charge=1.6E-19; //C double e_mass=1E-31; //kg double N=1E22; //m^-3 double w0=1E10;
int main()
{
/*Constants----*/
double e0=8.85E-12; //C^2/Nm^2
double e_charge=1.6E-19; //C
double e_mass=1E-31; //kg
double N=1E22; //m^-3
double w0=1E10; //rad/seg
double gam=5;
double f=(N*pow(e_charge,2))/(e_mass*e0);
/*--------------*/
double delta=50;
double step=0.1;
int array_size=2*delta/step;
double Re_X[array_size];
double Im_X[array_size];
double Re_X_KK[array_size];
double Im_X_KK[array_size];
double i,k;
int j,z;
for(i=w0-delta ; i<=w0+delta ; i=i+step ){
Re_X[j]=f*(pow(w0,2)-pow(i,2))/(pow(pow(w0,2)-pow(i,2),2)+4*pow(i,2)*pow(gam,2));
Im_X[j]=f*(2*i*gam)/(pow(pow(w0,2)-pow(i,2),2)+4*pow(i,2)*pow(gam,2));
j++;
}
/*This is just a test*/
z=0;
for(j=0 ; j<=10 ; j++){
z++;
printf("%d\n",z);
}
return(0);
}
intmain()
{
/*常数----*/
双e0=8.85E-12;//C^2/Nm^2
双e_电荷=1.6E-19;//C
双e_质量=1E-31;//kg
双N=1E22;//m^-3
双w0=1E10;//rad/seg
双gam=5;
双f=(N*pow(e_电荷,2))/(e_质量*e0);
/*--------------*/
双三角=50;
双台阶=0.1;
int数组_size=2*增量/步长;
双Re_X[数组大小];
双Im_X[数组大小];
双Re_X_KK[数组大小];
双Im_X_KK[数组大小];
双i,k;
int j,z;
对于(i=w0 delta;i使用调试器:
Program received signal SIGSEGV, Segmentation fault.
0x0000555555555808 in main () at demo.c:29
29 Im_X[j]=f*(2*i*gam)/(pow(pow(w0,2)-pow(i,2),2)+4*pow(i,2)*pow(gam,2));
(gdb)
您正在Re_X[j]=…;
和Im_X[j]中使用未初始化的变量(j
)=…;
由于j
被未初始化地用作下标写入Re\u X
和Im\u X
,这会破坏堆栈上的内存。这解释了当注释部分代码时,程序如何任意工作或不工作的观察结果。正在注释的代码是未注释的ed,但偶然的是,内存损坏在程序的不同运行中表现不同
解决这类错误的一个有用工具是,通过使用-fsanize=address编译在clang或gcc中启用,或者如果您使用的是Xcode,则会启用。另一个很棒的工具是。您可能不应该混合使用浮点和整数数学。调试每一行并打印所有变量的值,以查看发生了什么。定义所有double
数组作为全局变量或更好-使用malloc()
类似double Re\u X=malloc(数组大小*sizeof(double))
与您的问题无关,但我建议您将其值不会更改为常量的所有变量限定为常量。您从未初始化j
。它是随机垃圾,用作数组索引会导致未定义的行为谢谢大家!我们也会考虑您的建议。就是这样!谢谢!