PDA

View Full Version : [c]=deallocazione array di puntatori a caratteri


mercury841
11-07-2006, 11:22
se ho un array di puntatori a carattere in cui l'ultimo elemento punta a NULL, per deallocarlo va bene questa funzione:



void dealloca(char **array_di_stringhe){

int i=0;

while ( array_di_stringhe[i] != NULL ){
free(array_di_stringhe[i]);
i=i+1;
}
free(array_di_stringhe[i]);
free(array_di_stringhe);
return;

}



ciao e grazie per l'aiuto.

sottovento
11-07-2006, 11:55
Come mai fuori dal ciclo c'e' un

free(array_di_stringhe[i]);
?

mercury841
11-07-2006, 11:58
non so se serve, l'ho messo per deallocare l'ultimo puntatore a NULL.

grazie per la pazienza,ciao

sottovento
11-07-2006, 12:03
non so se serve, l'ho messo per deallocare l'ultimo puntatore a NULL.

grazie per la pazienza,ciao
Well, veramente il puntatore a NULL non andrebbe deallocato. Farlo comporta un crash (non sempre succede).
Il mio consiglio e' di evitare questa operazione

High Flying
Sottovento

mercury841
11-07-2006, 12:30
ok, grazie. Però c'è un problema: quando cerco di dellocare in un programma con questa funzione il processo è come se andasse in crash(cioè termina in modo anormale e stampa a video killed), se invece tolgo dalla funzione l'istruzione "free(array_di_stringhe);" il programma funziona tranquillamente.

trallallero
11-07-2006, 13:39
ok, grazie. Però c'è un problema: quando cerco di dellocare in un programma con questa funzione il processo è come se andasse in crash(cioè termina in modo anormale e stampa a video killed), se invece tolgo dalla funzione l'istruzione "free(array_di_stringhe);" il programma funziona tranquillamente.
come ti dice sottovento togli l'istruzione fuori dal ciclo ;)

poi prova con questo metodo professionale di debug :D
(se hai un output disponibile) e vedi se ancora si rompe:

void dealloca(char **array_di_stringhe){

int i=0;

puts( "1" );

while ( array_di_stringhe[i] != NULL ){
free(array_di_stringhe[i]);
i=i+1;
}
puts( "2" );

free(array_di_stringhe);
puts( "3" );

return; // NON SERVE ;)
}

Black imp
11-07-2006, 13:52
scusa ma che senso ha deallocare un puntatore a NULL? se punta a NULL vuol dire che non punta ad alcun indirizzo e quindi giustamente il SO non sa che cosa deallocare. è sbagliato concettualmente. è come chiedergli di svuotare un frigo che non esiste.

mercury841
11-07-2006, 14:43
Ok grazie a tutti ho risolto, era un problema del mio programma non della funzione di deallocazione. Ho tolto anche il free sul puntatore a NULL.

Ciao

trallallero
11-07-2006, 15:00
Ok grazie a tutti ho risolto, era un problema del mio programma non della funzione di deallocazione. Ho tolto anche il free sul puntatore a NULL.

Ciao
é facile che ci sia un controllo sul puntatore tipo:

void free( void *p)
{
if (!p)
return;
...
}

io l'avrei un controllo del genere :read: :D