C语言编程中的段错误
我正在使用C语言制作velocity Verlet方法。 我以为我做得很好。然而,每当我增加向量或数组的大小,x和y时,就会弹出“分段错误(核心转储)”。 对于大小n等于且小于1e3的情况,这很好,但在n=1e4时,程序会出错 请任何人在这方面帮助我。 多谢各位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
#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;ifor(y[0]=0,i=1;ifor(y[0]=0,i=1;ifor(y[0]=0,i=1;ifor(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]);
}