Free() invalid next size (fast)

di il
5 risposte

Free() invalid next size (fast)

Salve a tutti
Premetto che sono molto ignorante in materia e vorrei chiedere gentilmente aiuto a tutti voi esperti, sto scrivendo un programma in C che legga da un file di testo dei dati e li aggiunga in una lista, ma anche se viene compilato il programma si arresta alla prima riga di testo, con il seguente messaggio di errore : free() invalid next size (fast).
qualcuno saprebbe come correggerlo?
ecco qui il codice
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

 struct nodo {
        int age;
        char *name;
        char *naz;
        char *info;
        struct nodo *next;
    };

    void printlist(struct nodo *t);

int main(int argc, char **argv)
{

    char tmp1[50],tmp2[10],tmp3[100];
    int age;

    printf("Esercitazione 1, code : 5!\n");
    struct nodo *lista = NULL, *t;

    FILE *fp;

    fp = fopen("ciclisti.txt","r");
    if(!fp){
        fprintf(stderr,"Errore : \n");
        perror("  ");
        exit(EXIT_FAILURE);
    }
    if (fp) {
        printf("Ho aperto il file!\n");
    }
    printf("Inizio la lettura da file!\n");

    while(fscanf(fp,"%d;%[^;];%[^;];%[^\n]",&age,tmp1,tmp2,tmp3)==4)
        {

            t = malloc(sizeof(struct nodo));
            t->age=age;
            t->name=malloc(sizeof(strlen(tmp1)+1));
            t->naz=malloc(sizeof(strlen(tmp2)+1));
	    t->info=malloc(sizeof(strlen(tmp3)+1));
            strcpy(t->name,tmp1);
            strcpy(t->naz,tmp2);
            strcpy(t->info,tmp3);

            t->next = lista;
            lista=t;

            printlist(lista);

            free(t->name);
            free(t->naz);
            free(t->info);
        }

    fclose(fp);
    return 0;
}

void printlist(struct nodo *t){
  if(!t) return;

  printf("Dati del nodo: %d %s %s %s\n",t->age,t->name,t->naz, t->info);

  printlist(t->next);
}
il file di testo è strutturato nel seguente modo:
1968;MERCKX Eddy;bel;Faema
1967;GIMONDI Felice;ita;Salvarani
Grazie a tutti !

5 Risposte

  • Re: Free() invalid next size (fast)

    Ma perché fai le free nel ciclo di lettura??
  • Re: Free() invalid next size (fast)

    Va fatto fuori vero? Comunque ho provato a toglierlo e non funziona lo stesso. Che ne pensi?
  • Re: Free() invalid next size (fast)

    Risolto, il problema era dato dal malloc in cui non ci andava il sizeof ora penso ad aggiustare il freelista
  • Re: Free() invalid next size (fast)

    Beh, non credo sia la sizeof ...
  • Re: Free() invalid next size (fast)

    Non so che dirti se vuoi ti posto il codice completo cosi ci puoi dare un'occhiata
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
     struct nodo {
            int age;
            char *name;
            char *naz;
            char *info;
            struct nodo *next;
        };
    
        void printlist(struct nodo *t);
        void freelist(struct nodo *t);
        void freenode(struct nodo *t);
        struct nodo *inserttail(struct nodo *head, struct nodo *n);
    
    int main(int argc, char **argv)
    {
    
        char tmp1[50],tmp2[10],tmp3[100];
        int age;
        printf("Esercitazione 1, code : 5!\n");
        struct nodo *lista = NULL, *t;
    
        FILE *fp;
    
        fp = fopen("ciclisti.txt","r");
        if(!fp){
            fprintf(stderr,"Errore : \n");
            perror("  ");
            exit(EXIT_FAILURE);
        }
        if (fp) {
            printf("Ho aperto il file!\n");
        }
        printf("Inizio la lettura da file!\n");
    
        while(fscanf(fp,"%d;%[^;];%[^;];%[^\n]",&age,tmp1,tmp2,tmp3)==4)
            {
    
                t = malloc(sizeof(struct nodo));
    
                t->age=age;
                t->name= malloc(strlen(tmp1)+1);
                t->naz= malloc(strlen(tmp2)+1);
    			t->info= malloc(strlen(tmp3)+1);
    
    			strcpy(t->name,tmp1);
                strcpy(t->naz,tmp2);
                strcpy(t->info,tmp3);
                lista=inserttail(lista,t);
    //            t->next = lista;
    //
    //
    //            lista=t;
    
    
            }
        printlist(lista);
        freelist(t);
        fclose(fp);
        return 0;
    }
    
    void printlist(struct nodo *t){
      if(!t) return;
    
      printf("Dati del nodo: %d %s %s %s\n",t->age,t->name,t->naz, t->info);
    
      printlist(t->next);
    }
    
    void freenode(struct nodo *t){
      free(t); //attenzione che potrebbe non essere sufficiente
    }
    
    
    void freelist(struct nodo *t){
      struct nodo *tmp;
    
      // se lista vuota non libero niente
      if(!t) return;
    
      // scorro la lista usando t e tmp
      // ad ogni ciclo tmp punta all'elemento successivo di t
      for(tmp=t->next;tmp;t=tmp,tmp=tmp->next) // NOTA: usare t=t->next NON funziona!
        freenode(t);
    
      // a fine ciclo rimane ancora da liberare l'ultimo nodo
      freenode(t);
    }
    
    
    struct nodo *inserttail(struct nodo *head,struct nodo *n){
      struct nodo *tmp;
    
      // dato che n diventa elemento di coda pongo il suo prossimo a NULL
      n->next=NULL;
    
      // se lista vuota diventa unico elemento
      if(!head){
        return n;
      }
    
      // cerco elemento di coda
      for(tmp=head;tmp->next;tmp=tmp->next); // corpo for() vuoto
    
      // tmp adesso punta all'ultimo elemento
      tmp->next=n;
    
      // ritorno testa (invariata ma devo comunque restituirla)
      return head;
    }
Devi accedere o registrarti per scrivere nel forum
5 risposte