分段故障 - 两个功能不同时运行

Sne*_*ury -2 c segmentation-fault

我的程序有以下代码

int main(void)
{
    int i,size;
    float vel_x[size],vel_y[size],vel_x0[size],vel_y0[size],rho[size],rho0[size];
    float *ux, *vy, *ux0, *vy0;
    float *r, *r0;
    struct fdparam fdparam_1;

    printf("Enter the number of grid points: \t");
    scanf("%d", &fdparam_1.N);
    printf("Enter the maximum number of iterations: \t");
    scanf("%d", &fdparam_1.MAXIT);
    printf("Enter the value for time domain: \t");
    scanf("%f", &fdparam_1.t_domain);
    printf("Enter the time step and density of the fluid: \t \t");
    scanf("%f\t%f", &fdparam_1.Dt, &fdparam_1.dens);
    printf("Enter the diffusion coefficient and viscosity: \t \t");
    scanf("%f\t%f",&fdparam_1.diff, &fdparam_1.mu);
    printf("The parameters are N=%d, MAXIT=%d, t_domain=%f, Dt=%f, diff=%e, mu=%e, dens=%f \n",fdparam_1.N, fdparam_1.MAXIT, fdparam_1.t_domain, fdparam_1.Dt, fdparam_1.diff, fdparam_1.mu, fdparam_1.dens);

    size=(fdparam_1.N+2)*(fdparam_1.N+2);
    printf("The size is %d \n",size );

    r  = (float*) calloc (size,sizeof(float));
    r0 = (float*) calloc (size,sizeof(float));
    ux = (float*) calloc (size,sizeof(float));
    vy = (float*) calloc (size,sizeof(float));
    ux0 = (float*)calloc (size,sizeof(float));
    vy0 = (float*)calloc (size,sizeof(float));

    var_init(fdparam_1.N,r0,ux0,vy0,fdparam_1.dens);

//      t=0;    
//      Solver functions
//      while (t<fdparam_1.t_domain){
      velocity_solve(fdparam_1.N,ux,vy,ux0,vy0,fdparam_1.Dt,fdparam_1.mu,fdparam_1.MAXIT);    //calculates ux and vy to be used in the density solver
    density_solve(fdparam_1.N,r,r0,ux,vy,fdparam_1.Dt,fdparam_1.diff,fdparam_1.MAXIT);      //uses ux and vy calculated from Navier Stokes in the velocity solver to calculate density r
//      t+=fdparam_1.Dt
//      }
}

    //velocity solver function

    void velocity_solve(int n, float *u, float *v, float *u0, float *v0, float dt, float m, int MAXITER)
{
    int i,j;

    add_source(n,u,u0,dt);          add_source(n,v,v0,dt);
    swap(u0,u);     swap(v0,v);
    diffusion(n,u,u0,dt,m,MAXITER);         diffusion(n,v,v0,dt,m,MAXITER);
    projection(n,u,v,u0,v0,MAXITER);
    swap(u0,u);     swap(v0,v);
    advection(n,u,u0,u0,v0,dt);     advection(n,v,v0,u0,v0,dt);
    projection(n,u,v,u0,v0,MAXITER);

    printf("Printing velocities now \n");
    for (i=0; i<=n+1; i++){
            for (j=0;j<=n+1;j++){
                    printf("%f \t %f \n",u[ix(i,j)],v[ix(i,j)]);
            }
    }
}

// density solver function

void density_solve(int n, float *x, float *x0,  float *u, float *v, float dt, float diff, int MAXITER)
{
    int i,j;

    add_source(n,x,x0,dt);
    swap(x0,x);
    diffusion(n,x,x0,dt,diff,MAXITER);
    swap(x0,x);
    advection(n,x,x0,u,v,dt);

    printf("Printing density now \n");
    for (i=0;i<=n+1;i++){
            for (j=0; j<=n+1;j++){
                    printf("%f \t",x[ix(i,j)]);
            }
    }
    printf("\n");

}
Run Code Online (Sandbox Code Playgroud)

而执行此代码,我面临的主要问题是,我得到一个分段错误,当我尝试运行两者的功能velocity_solvedensity_solve在一起.这两个函数在单独运行时正确执行,即当我发表评论时velocity_solve,density_solve运行正常,反之亦然.

我很确定在velocity_solvedensity_solve例程中使用的函数没有任何问题,因为这两个例程都不会给出单独的输出.我怀疑当两个函数相互作用时会出现问题,即velocity_solve需要使用的输出density_solve.

我尝试初始化size变量,但它根本没有任何区别.但后来我意识到我没有使用定义的数组,所以我把它们注释掉,而是使用我已经分配了内存的指针,那么为什么当我尝试调用这两个函数时它仍然会出现分段错误在主要功能?

有人能说出代码中出了什么问题吗?

Som*_*ude 6

您没有初始化size,因此它的值将是不确定的,当您使用它来创建数组时,您将具有未定义的行为.

未定义的行为会使整个程序格式不正确.