PDA

View Full Version : [C] Puntatori a funzioni e dubbio.


nico88desmo
30-09-2007, 14:11
Partiamo con il dubbio...
Se ho una funzione che restituisce una stringa allocata all'interno della funzione stessa..
Es.:

char * retStr (void) {
char *parola;

paorla = (char *) malloc (sizeof(char)*6);
strcpy(parola,"vedarò");

return parola;
}


...questo potrebbe essere un modo correto per scrivere la funzione?
Ho provato in alcuni programmini e funziona..però il mio dubbio è il seguente:
una volta che la funzione termina, tutte le variabili allocate all'interno di essa vengono liberata automaticamente..in teoria. Quindi come mai la stringa ritornata dalla funzione è ancora presente?

Un'altra cosa...
E' possibile scrivere un puntatore ad una funzione compatibile con funzioni dichiarate in modo diverso?
Es.:


void (*agg) (int, int);
void (*str) (char);


E' possibile in seguito scrivere questo?

void (*ptr) = agg;
void (*ptr) = str;


Spero di essere stato chiaro...Grazie a tutti!

andbin
30-09-2007, 14:50
Se ho una funzione che restituisce una stringa allocata all'interno della funzione stessa..
Es.:

char * retStr (void) {
char *parola;

paorla = (char *) malloc (sizeof(char)*6);
strcpy(parola,"vedarò");

return parola;
}


...questo potrebbe essere un modo correto per scrivere la funzione?Tecnicamente è corretto .... dovresti però (nel caso specifico sopra), allocare 7 caratteri e non solo 6, perché c'è anche il nullo finale che viene copiato da strcpy dopo i sei caratteri nella stringa.

EDIT: hai sbagliato a scrivere la stringa? O sono proprio 6 caratteri?

una volta che la funzione termina, tutte le variabili allocate all'interno di essa vengono liberata automaticamente..in teoria. Quindi come mai la stringa ritornata dalla funzione è ancora presente?Perché è allocata dinamicamente. Il sistema ha allocato un tot di memoria a partire da un certo indirizzo e questa area di memoria esiste fino a quando si farà esplicitamente una free.

Tu dalla funzione ritorni semplicemente un indirizzo, una copia del valore contenuto nella variabile 'parola'. Se tale variabile "sparisce", non cambia nulla per l'area di memoria allocata.

E' possibile scrivere un puntatore ad una funzione compatibile con funzioni dichiarate in modo diverso?
Es.:


void (*agg) (int, int);
void (*str) (char);


E' possibile in seguito scrivere questo?

void (*ptr) = agg;
void (*ptr) = str;
'agg' e 'str' sono puntatori a funzione. 'ptr' è un puntatore a void. Le due assegnazioni sotto sono anche valide (e tecnicamente sarebbe più corretto mettere un cast esplicito) ma poi .... non so a cosa ti servirebbe. Avresti un puntatore a void, cioè non sai a cosa punta...

nico88desmo
30-09-2007, 20:12
Tecnicamente è corretto .... dovresti però (nel caso specifico sopra), allocare 7 caratteri e non solo 6, perché c'è anche il nullo finale che viene copiato da strcpy dopo i sei caratteri nella stringa.

EDIT: hai sbagliato a scrivere la stringa? O sono proprio 6 caratteri?


In dialetto trevigiano vedrò = vedarò..e a causa di questo mi sono dimenticato che c'è il carattere "\0" di fine stringa :p


Perché è allocata dinamicamente. Il sistema ha allocato un tot di memoria a partire da un certo indirizzo e questa area di memoria esiste fino a quando si farà esplicitamente una free.

Tu dalla funzione ritorni semplicemente un indirizzo, una copia del valore contenuto nella variabile 'parola'. Se tale variabile "sparisce", non cambia nulla per l'area di memoria allocata.


Capito..quindi non è un errore oppure qualcosa di scosigliato come mi diceva il mio prof... :D


'agg' e 'str' sono puntatori a funzione. 'ptr' è un puntatore a void. Le due assegnazioni sotto sono anche valide (e tecnicamente sarebbe più corretto mettere un cast esplicito) ma poi .... non so a cosa ti servirebbe. Avresti un puntatore a void, cioè non sai a cosa punta...

Si si...era un esempio...perchè di puntatore a funzione non li ho mai utilizzati..e per questo avevo il dubbio.
Ora comunque ho già tutto più chiaro :D

nico88desmo
01-10-2007, 09:05
Un'altra cosa riguardo il ritorno di un puntatore...
e se io avessi fatto la funzione in questo modo funzionerebbe lo stesso?


int * retInt (void) {

int a;
a = 5;

return &a;
};

andbin
01-10-2007, 09:12
e se io avessi fatto la funzione in questo modo funzionerebbe lo stesso?


int * retInt (void) {

int a;
a = 5;

return &a;
};
Tecnicamente compilerebbe e funzionerebbe ma non sarebbe corretto. Ritorni l'indirizzo di una variabile locale che non esiste più dopo che la funzione termina. Il chiamante avrebbe quindi un puntatore che punta sullo stack ma non avrebbe senso usarlo. E se lo usassi .... beh ti potrebbe funzionare finché non chiami un'altra funzione che va a riusare lo spazio di stack dove era quella variabile 'a'.

Torav
01-10-2007, 09:12
no, per fare una cosa del genere dovresti usare la keyword static! oppure dichiarare la a globalmente (brrrrr):)

nico88desmo
01-10-2007, 10:05
Grazie ad entrambi :D