Newsgroup: it.comp.lang.c
Titolo: Problemi con free

Ciao a tutti! Ho un problema con il seguente programma: la parte di funzione
inserita sotto dovrebbe allocarmi la struttura FRASE per ricevere in input
tutte le parole contenute nella frase. La funzione alloca perfettamente la
memoria, e tutto funziona. Il problema è che quando dealloco la frase
ottengo un bell'errore da Windows che mi dice la solita storia sul bad
memory block... Come mai?
Dome
typedef struct
{
 char *frase;
 uint len;
 char **parole;
 uint nParole;
} FRASE;
/* Prepara la struttura FRASE *lista a ricevere le informazioni attese */
 lista->parole = malloc(lista->nParole * sizeof(char*));
 if(!lista->parole)
  return -2;
 /* Analizza il contenuto della frase*/
 for(i=0; sscanf(dup, "%s", parola) != EOF && i<lista->nParole; i++)
 {
  /* Cancella la parte gia letta */
  for(j=0;j<strlen(dup) && dup[j]==' ';j++);     // questa roba non serve
per il mio problema!
  for(k=0;k<strlen(parola);k++)                        //
   dup[j+k] = ' ';                                               //
  lista->parole[i] = malloc(strlen(parola) * sizeof(char));
  if(!lista->parole[i])
   return -3;
  sprintf(lista->parole[i], "%s", parola);
 }
void DistruggiFrase(FRASE *lista)
{
  uint i;
 for(i=0; i<lista->nParole; i++)
 {
  if(lista->parole[i])
   free(lista->parole[i]);
  lista->parole[i] = NULL;
 }
 if(lista->parole)
  free(lista->parole);
 lista->parole = NULL;
 return;
}

  sprintf(lista->parole[i], "%s", parola);
Qui bastava
   strcpy(lista->parole[i],parola);
usare sprintf e' come ammazzare la mosca con un cannone.
Questo e' anche un punto in cui il tuo programma sconfina...
per fare una strcpy di una stringa "parola" e' necessario avere
allocato "1 + strlen" caratteri... ovvero anche lo spazio per
lo '\0' finale di chiusura stringa.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

> No. Il programma e' errato e solo *in apparenza* sembra funzionare.
Dove hai notato un errore (oltre al \0 non tenuto in conto quando alloco)?
Per sprintf lo so, l'ho messa per un motivo stupido solo temporaneamente,
provvedero subito a sostituirla.
Per quanto riguarda il sizeof(char), è 1 su tutti i sistemi? a me non
sembra, nel senso che un po di tempo fa ho letto un post dove si parlava di
CHINASYSTEM o una cosa del genere... può essere? Non so quanto possano
essere affidabili quelle info, ma alla fine, non succede NULLA se moltiplico
per 1 (al massimo ci mette un miliardesimo di secondo in piu a svolgersi).
Dome

miliardesimo di secondo in piu a svolgersi).
Una moltiplicazione per la costante 1 viene normalmente rimossa
automaticamente dal compilatore. Altri consigli che dava l'amico
(come moltiplicare per sizeof(int) quando si usano puntatori ad
intero) invece sono tremendamente dannosi.
La cosa piu' fastidiosa e' quando qualcuno, pur rendendosi conto
di aver detto cose false, insiste nella difesa ad oltranza...
depistando chi come te si avvicina all'argomento.
Comunque per me puoi scrivere benissimo malloc(100*sizeof(char)):
contento tu contenti tutti.
Se pero' io fossi un docente di programmazione C che vede
scritta una roba del genere avrei certamente qualche idea
sulla prima domanda per l'orale.


CHINASYSTEM o una cosa del genere... può essere? 
Idiozie.
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>