[prog-it] Re: Il codice.

  • From: "z3lig" <mailmaxi@xxxxxxxxx>
  • To: <prog-it@xxxxxxxxxxxxx>
  • Date: Sat, 12 Jan 2002 15:19:23 +0100

From: "brain" <xbrain@xxxxxxxxxx>
Subject: [prog-it] Il codice.


>......
> Il problema: oltre il terzo contronto, nella mbox_get_msg_index(), non
> posso piu' liberare la memoria di s: se lo faccio mi da' Segmentation
> fault. Perche'?
>
..........
>
> /* parser per i messaggi all'interno di una mbox */
> GList *mbox_get_msg_index(FILE *mbox)
> {
>     GList *list = NULL;
>     gpointer data;
>     struct msg_s *msg;
>     char *s;
>     guint status = 0;
>
>     /* riempi msg */
>     while (s = readline(mbox)) {
>         // puts(s);
>         if (!status && !strncmp(s, "From ", 5)) {
>             msg = msg_new();
>             msg-> head = ftell(mbox);
>             status = 1;
>             free(s);
>         }
>         else if (status && !strncmp(s, "From: ", 6)) {
>             s += 6;
>             s[strlen(s) - 1] = '\0';
>             msg->from = g_strdup(s);
>             free(s);
>         }
>         else if (status && !strncmp(s, "Date: ", 6)) {
>             s += 6;
>             s[strlen(s) - 1] = '\0';
>             msg->date = g_strdup(s);
>             /* se provo a liberare s qui da' Segmentation fault. :-\ */
>             /* free(s); */
>         }
>         else if (status && !strncmp(s, "Subject: ", 9)) {
>             s += 9;
>             s[strlen(s) - 1] = '\0';
>             msg->subject = g_strdup(s);
>             /* free(s); */
>         }
>         else if (status && !strncmp(s, "To: ", 4)) {
>             s += 4;
>             s[strlen(s) - 1] = '\0';
>             msg->to = g_strdup(s);
>             /* free(s); */
>         }
>         else if (status && !strncmp(s, "Reply-To: ", 9)) {
>             s += 9;
>             s[strlen(s) - 1] = '\0';
>             msg->replyto = g_strdup(s);
>             /* free(s); */
>         }
>         else if (status && !strncmp(s, "Status: ", 8)) {
>             s += 8;
>             s[strlen(s) - 1] = '\0';
>             /* ... */
>             /* free(s); */
>         }
>         else if (status && !strcmp(s, "\n")) {
>             msg->body = ftell(mbox);
>             list = g_list_append(list, (gpointer) msg);
>             status = 0;
>             /* free(s); */
>         }
>         else free(s);
>         // getchar();
>     }
>     return(list);
> }


solo ora ho guardato il tuo codice (l'influenza non se ne vuole andare :-(
....)

non so dirti bene il perche' ma azzardo un'ipotesi:

secondo me quando liberi la memoria con free,
"s" non punta piu' alla memoria che hai creato con la malloc()
ma punta 6 caselle piu' avanti, prova a liberarla cosi'
free(s-6)
io ho provato e non mi da piu' errore :-)
pero' dovresti correggere anche le altre parti che non ti danno
errore.....
.....ora non so, se sia questo il vero motivo, c'e' qualcuno che puo' dirmi
se ho detto una cosa giusta o una cazzata?

cmq bravo ,complimenti per il tuo lavoro :-)
se avrai modo di postare altro codice del tuo mailreader ne saremo felici
:-)

ciao

z3lig




Other related posts: