Código en C. Una ayuda con la reserva dinámica de memoria.

Os pongo el código:

int carga_plantilla(char *fichero)
{
    FILE *entrada=NULL;
    int i=0,j=0;
    char *cadena=NULL;


    if((entrada=fopen(fichero,"r"))==NULL)     return 0;
    l_plantilla=(char **)malloc(sizeof(char *)*NTEMAS);
    if(l_plantilla==NULL)   return 0;

    if((cadena=(char *)malloc(sizeof(char)*MAX_BUFFER))==NULL)
    {
        free(l_plantilla);
        return 0;
    }

    while(feof(entrada)==0)
    {
        fgets(cadena, MAX_BUFFER,entrada);
         if((l_plantilla[i]=(char *)malloc(sizeof(char)*(strlen(cadena)+1)))==NULL)
        {
            free(cadena);
            for(j=0;j<i;j++)
                free(l_plantilla[j]);
            free(l_plantilla);
            return 0;
        }
        strcpy(l_plantilla[i],cadena);
        i++;
    }

    if(cadena!=NULL)    free(cadena);
    free(l_plantilla[i-1]);     //Antes de alcanzar EOF se entra una vez de más en el bucle
    fclose(entrada);
    return 1;
}



Os explico un poco de que va. l_plantilla es un char **, variable global a la que damos valor en esta función, prefiero evitar apuntes sobre el uso de variables globales, el guión me exige que sean así. Entonces voy leyendo de un fichero de texto, cuyo nombre recibo como argumento, línea a línea y lo voy almacenando en l_plantilla[i]. El problema me aparece a la hora de llegar al free(cadena)... Violación del segmento me dice, pero compruebo que el puntero a liberar sea el mismo que el que reservé (es decir que cadena no se haya modificado) y parece correcto.

Me estoy volviendo loco. Un saludo.
0 respuestas