Newsgroup: it.comp.lang.c
Titolo: chiarimento su free per array di puntatori

Ciao a tutti, mi chiamo Antonello, ho una domanda da farvi, in un mio
progetto ho realizzato una funzione che ritorna un array di puntatori a
carattere quindi qualche cosa del tipo char **pippo.
Per crearlo ho fatto all'inizio una malloc su pippo del numero di
elementi e poi per ciascun elemento una malloc sulla lunghezza della
stringa da contenere.
Ho un problema in fase di rilascio della memoria ho fatto una free di
tutte le stringhe in un ciclo for, e alla fine del ciclo, faccio la
free sul puntatore pippo:
void pulisci(char **pippo, int count){
	int i=0;
	char **app=pippo;
	for(i=0;i<count;i++,*pippo++){
		free(*pippo);
	}
	free(app);
}
Questa cosa è corretta o no? Mi serve di capire se il principio usato
è quello giusto, perché il codice eseguito su macosx e su linux
funziona ma su windows va in crash proprio sull'ultima free.
Grazie a tutti 
Antonello

 
Va in crash perchč quando viene eseguita free(app), app stesso non punta 
piů a pippo o meglio pippo č stata cancellata alla prima iterazione e 
quindi app punta ad una locazione casuale che su molti sistemi (come 
windows) puntano ad aree riservate perchč riutilizzate o perchč pulite 
in precedenza (ecco spiegato il crash).
Non c'č bisogno dell'ultima istruzione free

 Non c'è bisogno dell'ultima istruzione free

  for(i=0;i<count;i++,*pippo++){
Dereferenziare 'pippo' non ha alcun effetto qui; puoi semplicemente scrivere
   for(i=0;i<count;i++, pippo++ ){
Max

Grazie della risposta max,
sto ancora cercando di trovare una soluzione al problema, che però non
riesco ad individuare, in particolare la mia funzione di ripulitura
genera molti problemi su windows mentre su macchine *nix no, ma quello
che mi interessa capire è la soluzione che ho adottato è corretta o
meno, provo quindi a darvi maggiori dettagli, la funzione che genera il
vettore di puntatori effettua una split di una stringa rispetto ad un
particolare carattere quindi questa è la mia split
char **splitString(char *source, char sep,int *destNum)
{
  int i=0, j=0,substring=0, round=0, flag=0;
  char *head=NULL, *tail=NULL,*temp=NULL,**retArr=NULL,**dest=NULL ;
  head=temp=tail=source;
  for (j=0;j < (int)strlen(source);j++,*temp++){
    if(*temp == sep) {
      i++;
      while(*temp == sep) {
		  *temp++;
		  j++;
      }
    }
  }
  temp=head;
  tail=temp+(strlen(source)-1);
  if(*tail == sep) i--;
  if(*head == sep) {
	  i--;
	  flag=1;
  }
  *destNum=i+1;
  if( (dest=(char **) malloc ((i+1)*sizeof(char *) )) == NULL)
fatalErr("malloc numero elementi in splitString");
  retArr=dest;
  temp=head;
  while(*temp!='\0'){
	while(*temp == sep) *temp++;
    head=temp;
    while(*temp != sep && *temp!='\0' ){
      *temp++;
      substring++;
      tail=temp;
      if(*tail=='\0') *tail--;
    }
    if(*temp == sep || *temp == '\0') {
      if(((*dest)=(char
*)calloc((substring+1+flag),sizeof(char)))==NULL) fatalErr("calloc
substring in splitString");
      temp=head;
      if(flag){
		  sprintf(*dest,"%c",sep);
		  flag=0;
	  }
      for(i=0;i<substring;i++,*temp++)
sprintf(*dest,"%s%c",*dest,*temp);
      if(round++ <= *destNum){
	*temp++;
	while(*temp == sep) *temp++;
	*dest++;
      }
    }
    head=temp;
    substring=0;
  }/*Fine while *temp!='\0'*/
  return (retArr);
}
la funzione viene invocata con
splitString("pippo/pluto/paperino",'/',&numeroElementi)
e la memoria viene liberata con
void pulisciSplit(char **vett, int count){
	int i=0;
	char **app=vett;
	for(i=0;i<count;i++,vett++){
		free(*vett);
	}
	free(app);
}
spero che questo vi aiuti ad individuare il problema, e vi ringrazio in
anticipo per le eventuali risposte.
Antonello