PDA

Visualizza la versione completa : [C] Allocazione dinamica nel passaggio tra funzioni


ilmo lesto
19-06-2007, 23:49
questo il mio dilemma:
ho un puntatore, dichiarato all'interno di una funzione, che faccio puntare ad una zona di memoria con malloc.
l'indirizzo della zona di memoria viene ritornato dalla funzione e assegnato ad un altro puntatore presente nel main.
quindi eseguo le mie operazioni nel main, ma ad un certo punto lo spazio allocato dinamicamente e puntato ora dal mio puntatore dichiarato nel main, non mi serve pi.
quindi libero lo spazio puntato con free. corretta la procedura? non che rimane qualcosa, come dire, in "sospeso"?
io non credo, perch, avendo dichiarato il puntatore iniziale che avevo inizializzato con malloc all'interno della funzione, questo muore con essa (ma non lo spazio allocato nello heap). ma aspetto smentite da chiunque abbia voglia di leggere le due righe di codice postate poco sotto...



char *getString (char *tokenPtr);
char *altrafunzione (char *s);

int main(){

char *infix, *tokenPtr, *postfix;

.........istruzioni varie.........


//infix ora contiene un indirizzo che punta
//ad una zona di memoria allocata dinamicamente
//nella funzione getString
infix = getString(tokenPtr);

postfix = altrafunzione (infix);

free (infix) /*libero la memoria per infix visto che non mi serve piu'*/

return 0;

}




char *getString (char *tokenPtr){

char *string, *cursor;
int len;

...............istruzioni varie.............

string = (char*) malloc (len * sizeof(char));
//string viene allocato dinamicamente

if (string == NULL){
printf("\nImpossibile allocare memoria\n");
exit(1);
}

//copio la stringa puntata da cursor nell'area di memoria puntata da infix
strcpy (string, cursor);

strcat (string, " )"); //istruzione che serve al mio programma

return string; //ritorno string che e' allocato dinamicamente

}

XWolverineX
20-06-2007, 08:19
La procedura corretta.

ilmo lesto
20-06-2007, 10:56
se in alternativa avessi passato l'indirizzo del puntatore, avrei dovuto scrivere cos?




void getString (char *tokenPtr, char **string);

main(){

char *tokenPtr, *punct;

....................

getString (tokenPtr, &punct);

...................

free (punct);
}


void getString (char *tokenPtr, char **string){

......................

string = (char**) malloc (len * sizeof(char) );

.......................

return;

}



anche in questo modo ottengo lo stesso risultato...
se ha senso porre la domanda, quale metodo sarebbe pi opportuno praticare?

oregon
20-06-2007, 11:01
No ... questa dovrebbe essere

*string = (char*) malloc (len * sizeof(char) );

ilmo lesto
20-06-2007, 11:09
No ... questa dovrebbe essere

*string = (char*) malloc (len * sizeof(char) );



hai ragionissima :D

e invece, per quanto riguarda la domanda finale: in questi casi meglio utilizzare un puntatore passato per valore o uno passato per riferimento? o non c' alcuna diferenza sostanziale?

oregon
20-06-2007, 12:29
Non ho compreso l'ultima domanda ... vuoi sapere se e' meglio usare il primo metodo che hai mostrato o il secondo?

ilmo lesto
20-06-2007, 12:39
Originariamente inviato da oregon
Non ho compreso l'ultima domanda ... vuoi sapere se e' meglio usare il primo metodo che hai mostrato o il secondo?

esattamente...

Loading