segmentation segmentacion mercado generado dumped c segmentation-fault

segmentacion - Error de segmentación: dos funciones no se ejecutan simultáneamente



segmentation fault(core dumped) c (2)

Tengo el siguiente código para mi programa

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"); }

El principal problema al que me estoy enfrentando al ejecutar este código es que obtengo una falla de segmentación cuando intento ejecutar juntas las funciones velocity_solve y density_solve . Las dos funciones se ejecutan correctamente cuando se ejecutan individualmente, es decir, cuando comento velocity_solve , density_solve ejecuta bien y viceversa.

Estoy bastante seguro de que no hay nada de malo en las funciones que se usan en las rutinas de velocity_solve y density_solve porque ninguna de las dos rutinas daría salidas individuales. Sospecho que algo va mal cuando se supone que las dos funciones interactúan, es decir, la salida de velocity_solve debe usarse en density_solve .

Intenté inicializar la variable de tamaño, pero luego no hizo ninguna diferencia. Pero luego me di cuenta de que no utilizo las matrices que están definidas, así que las comenté, en su lugar utilizo los punteros a los que ya asigné la memoria, entonces ¿por qué todavía da una falla de segmentación cuando intento llamar a ambas funciones? juntos en la función principal?

¿Alguien puede sugerir qué está mal en el código?


En su código, el size es una variable local de tipo almacenamiento auto . A menos que se inicialice explícitamente, tendrá basura o valor indeterminado , haciendo uso de lo que

float vel_x[size];

invoca comportamiento indefinido

Relacionado: del estándar C11 , capítulo 6.2.4, " Duraciones de almacenamiento de los objetos" ,

Párrafo 5:

Un objeto cuyo identificador se declara sin vinculación y sin el especificador de clase de almacenamiento static tiene una duración de almacenamiento automática, ...

y Párrafo 6:

... El valor inicial del objeto es indeterminado. ...

Además, del mismo documento, capítulo §6.7.9, "Inicialización" , párrafo 10

Si un objeto que tiene una duración de almacenamiento automática no se inicializa explícitamente, su valor es indeterminado.

y finalmente, del apéndice J.2, "Comportamiento indefinido"

El valor de un objeto con duración de almacenamiento automática se utiliza mientras es indeterminado


No inicializa el size , por lo tanto, su valor será indeterminado y tendrá un comportamiento indefinido cuando lo utilice para crear sus matrices.

El comportamiento indefinido hace que todo tu programa esté mal formado.