Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/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
C语言编程中的段错误_C_Segmentation Fault_Numerical Analysis_Verlet Integration - Fatal编程技术网

C语言编程中的段错误

C语言编程中的段错误,c,segmentation-fault,numerical-analysis,verlet-integration,C,Segmentation Fault,Numerical Analysis,Verlet Integration,我正在使用C语言制作velocity Verlet方法。 我以为我做得很好。然而,每当我增加向量或数组的大小,x和y时,就会弹出“分段错误(核心转储)”。 对于大小n等于且小于1e3的情况,这很好,但在n=1e4时,程序会出错 请任何人在这方面帮助我。 多谢各位 #include <stdio.h> #include <stdlib.h> #include <math.h> double verlet(double t, double x) { dou

我正在使用C语言制作velocity Verlet方法。 我以为我做得很好。然而,每当我增加向量或数组的大小,x和y时,就会弹出“分段错误(核心转储)”。 对于大小n等于且小于1e3的情况,这很好,但在n=1e4时,程序会出错

请任何人在这方面帮助我。 多谢各位

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double verlet(double t, double x)
{

  double E = 0.252;
  double B = 0.052;
  double a = M_PI/2;

  return -sin(x) + E*cos(t) + B*cos(2*t+a); 
}   

double pverlet(double(*f)(double, double), double dt, double t, double x, double y)
{
    return  x + dt*( y + (dt/2)*f(t, x));
}

double vverlet(double(*g)(double, double), double dt, double t, double x,  double y)
{
    return y + (dt/2) * g(t, x); 
}

int main(void)
{
int i;
double t;

int n = 1e4;
double ti = 0, tf = 1e5, dt = (tf-ti)/n; 

double *x = (double *) malloc(sizeof(double)*n);
double *y = (double *) malloc(sizeof(double)*2*n);

if (x == NULL)
{
    printf("error allocating memory!\n");
    return 1;
}
if (y == NULL)
{
    printf("error allocating memory!\n");
    return 1;
}

for (y[0] = 0, i = 1; i <2*n; i++)
{
    y[i] = vverlet(verlet, dt, ti + dt*(i-1), x[i-1], y[i-1]);
}

for (x[0] = 0, i = 1; i < n; i++)
{
    x[i] = pverlet(verlet, dt, ti + dt*(i-1), x[i-1], y[2*(i-1)]);
}



for (i = 0; i < n; i++)
{
    t = ti + dt * i;
    printf("%e %e %e\n", t, x[i], y[2*i]);  

}

return 0;
free(x);
free(y);
}
#包括
#包括
#包括
双维莱特(双t,双x)
{
双E=0.252;
双B=0.052;
双a=M_PI/2;
返回-sin(x)+E*cos(t)+B*cos(2*t+a);
}   
双pverlet(双(*f)(双,双),双dt,双t,双x,双y)
{
返回x+dt*(y+(dt/2)*f(t,x));
}
双vverlet(双(*g)(双,双),双dt,双t,双x,双y)
{
返回y+(dt/2)*g(t,x);
}
内部主(空)
{
int i;
双t;
int n=1e4;
双ti=0,tf=1e5,dt=(tf-ti)/n;
double*x=(double*)malloc(sizeof(double)*n);
double*y=(double*)malloc(sizeof(double)*2*n);
如果(x==NULL)
{
printf(“分配内存时出错!\n”);
返回1;
}
如果(y==NULL)
{
printf(“分配内存时出错!\n”);
返回1;
}

对于(y[0]=0,i=1;i
for(y[0]=0,i=1;i
for(y[0]=0,i=1;i
for(y[0]=0,i=1;i
for(y[0]=0,i=1;我试过调试吗?第一个循环访问
x
的范围之外。它运行到
i。而且,在使用
x
数组的内容之前,您从未初始化该数组。您试过调试吗?第一个循环访问
x
的范围之外。它运行到
i。您也从未初始化
x
数组在使用它的内容之前。你试过调试吗?第一个循环访问
x
的范围之外。它运行到
i,你在使用它的内容之前从未初始化
x
数组。你试过调试吗?第一个循环访问
x
的范围之外。它运行到
i,你也从未初始化
x
数组,然后再使用其内容。
for (y[0] = 0, i = 1; i <2*n; i++)
{
    y[i] = vverlet(verlet, dt, ti + dt*(i-1), x[i-1], y[i-1]);
}