Buenas tardes,
Estoy trabajando en un programa que lee ficheros, saca ciertos datos etc etc...
Linea por linea del fichero csv voy extrayendo el contenido con strtok y lo voy guardando en arrays.
El programa lee unas cuantas lineas pero luego falla y se sale sin dar mayor explicación.
Como imagino que será que no reservo bien memoria, he aislado el cómo trato la memoria con un pequeño programa (el que incluyo) donde se pide añadir una serie de nombres de Alumnos, y después pedir más.
El programa según añado cambios, he llegado a conseguir que lo visualice bien y finalice...pero se comporta bastante mal.
Por ejemplo si pongo un system("pause") antes de sacar por pantalla el listado final (el último for), y el numero de alumnos nuevos es menor que el numero de alumnos añadidos inicialmente lo muestra bien.
Si el numero de alumnos nuevos supera al inicial, aun con esa pausa, el programa falla.
He comparado, mirado webs, inclusive en este foro en temas anteriores para tratar de solventarlo... y no doy con la cuestión.
Gracias de antemano, toda posible pista seguro que me es de ayuda.
Un saludo
Adjunto el código:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define NOMBRE 20
typedef struct{
//... demás variables que no afectan a la cuestion .../
char **listado_alumnos;
}registro;
int alumnado(registro *profesor);
void main(){
registro profesor;
alumnado(&profesor);
}
int alumnado(registro *profesor)
{
int cant, i,n_mas,tam;
char cdn[100];
system("cls");
printf("Numero de alumnos: ");
scanf("%d", &cant);
fflush(stdin);
profesor->listado_alumnos = (char **)malloc(cant * sizeof(char)); //reservo "filas"
if(profesor->listado_alumnos==NULL){
fprintf(stderr,"Error en la asignacion de memoria");
exit(-1);
}
for(i = 0; i < cant; i++)
{
printf("Nombre Alumno %d: ", i + 1);
scanf("%s",&cdn);
fflush(stdin);
profesor->listado_alumnos=(char*)malloc(NOMBRE*sizeof(char)); /*reservo "columnas" */
strcpy(profesor->listado_alumnos,cdn);
}
//IMPRIMO
printf("LISTA DE ALUMNOS\n--------------------\n");
for(i = 0; i < cant; i++)
printf("->%d.\t%s\n", i + 1, profesor->listado_alumnos);
//sin añadir la parte de realloc ya falla el programa
printf("\n Cuantos alumnos mas quieres incluir:");
scanf("%d", &n_mas);
fflush(stdin);
int tam_total= n_mas+cant;
profesor->listado_alumnos=realloc(profesor->listado_alumnos,(tam_total)*sizeof(char *));/*reasigno "filas"*/
for(i = cant+1; i <(tam_total+1); i++) //reasigno "columnas"
{
printf("Nombre Alumno %d: ", i + 1);
scanf("%s",&cdn);
fflush(stdin);
profesor->listado_alumnos = (char*)malloc(NOMBRE*sizeof(char));
strcpy(profesor->listado_alumnos,cdn);
}
//IMPRIMO 2º ronda
printf("ALUMNOS NUEVOS\n--------------------\n");
for(i = cant+1; i <(tam_total+1); i++)
printf("->%d.\t%s\n", i + 1, profesor->listado_alumnos);
//system("pause");
//imprimo todo el listado_alumnos
printf("LISTA TOTAL DE ALUMNOS\n--------------------\n");
for(i = 0; i < tam_total; i++)
printf("->%d. \t %s \n", i + 1, profesor->listado_alumnos);
//libero memoria
for(i=0;i<tam_total;i++){
free(*(profesor->listado_alumnos+i));
}
free(profesor->listado_alumnos);
system("pause");
return 0;
}