Segmentation fault

Iniciado por xJajavierx, 3 Febrero 2020, 08:21 AM

0 Miembros y 1 Visitante están viendo este tema.

xJajavierx

Hola, alguien me podría ayudar a solucionar este "problema" de segmentation fault por favor

Este es el codigo:
Código (c++) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef struct alumno
{
   int matricula;
   int promedio;
}T_alumno;
int aleatorio20(int &cant);
int promedio10(int &prom);
int matricula(int &matr);
void iniciar_arreglo_alumnos(T_alumno *arreglo_alumnos, int &cant);
void imprime_arreglo_alumnos(T_alumno *arreglo_alumnos, int &cant, int &prom, int &matr);
int main()
{
   srand(time(NULL));
   int cant, prom, matr;
   T_alumno *arreglo_alumnos;
   aleatorio20(cant);
   promedio10(prom);
   matricula(matr);
   iniciar_arreglo_alumnos(arreglo_alumnos,cant);
   imprime_arreglo_alumnos(arreglo_alumnos,cant,prom,matr);
   return 0;
}
int aleatorio20(int &cant)
{
   cant=5+rand()%26;
}
int promedio10(int &prom)
{
   prom=rand()%11;
}
int matricula(int &matr)
{
   matr=124+rand()%77;
}
void iniciar_arreglo_alumnos(T_alumno *arreglo_alumnos, int &cant)
{
   arreglo_alumnos=new T_alumno[cant];
}
void imprime_arreglo_alumnos(T_alumno *arreglo_alumnos, int &cant, int &prom, int &matr)
{
   for(int i=0;i<cant;i++)
   {
       promedio10(prom);
       arreglo_alumnos[i].promedio=prom;
       matricula(matr);
       arreglo_alumnos[i].matricula=matr;
   }
   for(int i=0;i<cant;i++)
   {
       printf("Promedio %i: %d",i+1,arreglo_alumnos[i].promedio);
       printf("Matricula %i: 123%d",i+1,arreglo_alumnos[i].matricula);
   }
}

Eternal Idol

Primero el codigo no compila (aunque por el error que ves entiendo que el problema es de copiar y pegar) y segundo arreglo_alumnos siempre va a tener un valor indefinido.

(23) : warning C4700: uninitialized local variable 'arreglo_alumnos' used
    iniciar_arreglo_alumnos(arreglo_alumnos,cant);

Aca:
Código (c++) [Seleccionar]
void iniciar_arreglo_alumnos(T_alumno *arreglo_alumnos, int &cant)
{
    arreglo_alumnos=new T_alumno[cant];
}


arreglo_alumnos es simplemente una variable LOCAL (al estar pasandola por valor y no por referencia) y la asignacion se pierde en cuanto salis del ambito de la funcion. O pasas doble puntero o puntero por referencia para poder efectivamente asignarle el valor a la variable declarada en main AL TENER LA DIRECCION DEL MISMO EN iniciar_arreglo_alumnos y no a donde apunta (que en tu caso es a cualquier lado al no estar inicializada la variable).

Código (c++) [Seleccionar]
T_alumno *arreglo_alumnos;
printf("%p\n", arreglo_alumnos);
aleatorio20(cant);
    promedio10(prom);
    matricula(matr);
    iniciar_arreglo_alumnos(arreglo_alumnos,cant);
printf("%p\n", arreglo_alumnos);


Asi veras con claridad como iniciar_arreglo_alumnos no hace nada util.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

CalgaryCorpus

El codigo parece tener varias cosas que se pueden remover.

La funcion iniciar_arreglo_alumnos ademas de no servir el proposito, no parece ser necesaria. Eliminala, reemplaza su invocacion por la peticion explicita de memoria.

Las variables prom y matr en el main no tienen sentido definirlas alli, pues cambian su valor, pero no se usan al interior de la funcion. Definelas al interior de la funcion imprimir.

Pareciera mejor tener otra funcion que asigne esos valores y que la funcion imprimir solo muestre estos valores. No se ve bien que una funcion encargada de imprimir asigne los valores tambien.

Las funciones aleatorio20, matricula y promedio10 dicen retornar int, pero no retornan nada. Podrias en vez de modificar el parametro que reciben, borrar el parametro que reciben, que no reciban nada, y hacer return del valor que calculan. Con esto incluso no vas a necesitar las variables locales prom y matr, puedes asignar lo retornado directamente a los campos (lineas 47 y siguientes).
Aqui mi perfil en LinkedIn, invitame un cafe aqui