Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当int变量在循环内更新时,C代码不起作用_C_Loops_Variables - Fatal编程技术网

当int变量在循环内更新时,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;

我对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;              //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
。它是随机垃圾,用作数组索引会导致未定义的行为谢谢大家!我们也会考虑您的建议。就是这样!谢谢!