PDA

View Full Version : [C] Ritorno di puntatori


Unrue
30-08-2011, 18:14
Ciao a tutti,

ho un vuoto di memoria nel C nelle funzioni che ritornano puntatori :(

Immagino che fare così sia scorretto:


int*func(){
int var = 3;
int*var_p = &var;

return var_p

}

Perché var è locale, e si perderebbe una volta usciti dalla funzione.

Così invece dovrebbe essere corretto:


int*func(){

int*vect=malloc(100*sizeof(int));

return vect

}

Giusto? Ma vect non è comunque locale? Che dubbio stupido.. :muro:

AnonimoVeneziano
30-08-2011, 18:19
Ciao a tutti,

ho un vuoto di memoria nel C nelle funzioni che ritornano puntatori :(

Immagino che fare così sia scorretto:


int*func(){
int var;

return &var

}

Perché var è locale, e si perderebbe una volta usciti dalla funzione.

Così invece dovrebbe essere corretto:


int*func(){

int*vect=malloc(100*sizeof(int));

return vect

}

Giusto? Ma vect non è comunque locale? Che dubbio stupido.. :muro:



int*func(){

int*vect=malloc(100*sizeof(int));

return vect

}



Così ritorni un puntatore a un array di 100 int. La memoria allocata con malloc è allocata sullo HEAP che non è toccato dalle chiamate di funzione , quindi anche quando func() ritornerà la memoria rimarrà sempre allocata e potrai accedervi dal puntatore ritornato da func() , questa verrà deallocata solo alla chiusura del programma o se esplicitamente deallocata con "free()".

La variabile vect invece in func verrà eliminata perchè è una variabile automatica allocata sullo Stack.

Ciao

Unrue
30-08-2011, 22:57
Ok, perfetto.

Ma se volessi allocare una variabile nello heap, l'unico modo è farlo con una malloc? Oppure ci sono altri modi?

Se la funzione sopra dovesse ritornare un solo elemento, dovrei fare una malloc di un solo int? Supponendo di non voler fare la copia per valore.

AnonimoVeneziano
30-08-2011, 23:06
Ok, perfetto.

Ma se volessi allocare una variabile nello heap, l'unico modo è farlo con una malloc? Oppure ci sono altri modi?

Se la funzione sopra dovesse ritornare un solo elemento, dovrei fare una malloc di un solo int? Supponendo di non voler fare la copia per valore.

Per allocare sullo heap devi usare per forza malloc o simili (funzioni di api del sistema operativo di ancora più basso livello)

Per allocare un solo int il comando è ovviamente "malloc(sizeof(int))".

Ci sarebbe un altro modo per fare quello che hai descritto che ha l'unico problema di non essere thread safe e sarebbe quello di creare nella funzione una variabile di tipo static e ritornare un puntatore a quella :


int* func(){
static int var;

return &var

}



Le variabili static dentro le funzioni vengono allocate come le variabili globali (quindi non vengono cancellate al termine della funzione) ma lo scope del loro identificatore è solo all'interno della funzione. Ritornandone il puntatore puoi accedere alla variabile anche all'esterno della funzione.

Come ho detto questa soluzione però non è thread safe, in quanto la variabile è sempre la stessa ad ogni chiamata di func() (il puntatore non cambierà mai) quindi se due thread accedono contemporaneamente alla variabile ritornata da func() di fatto accedono alla stessa variabile e ci potrebbero essere problemi di concorrenza.

Ciao