|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
[C] Puntatori a funzioni e dubbio.
Partiamo con il dubbio...
Se ho una funzione che restituisce una stringa allocata all'interno della funzione stessa.. Es.: Codice:
char * retStr (void) { char *parola; paorla = (char *) malloc (sizeof(char)*6); strcpy(parola,"vedarò"); return parola; } 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.: Codice:
void (*agg) (int, int); void (*str) (char); Codice:
void (*ptr) = agg; void (*ptr) = str; |
![]() |
![]() |
![]() |
#2 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
EDIT: hai sbagliato a scrivere la stringa? O sono proprio 6 caratteri? Quote:
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. '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...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 30-09-2007 alle 14:55. |
||
![]() |
![]() |
![]() |
#3 | |||
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Quote:
![]() Quote:
![]() Quote:
Ora comunque ho già tutto più chiaro ![]() |
|||
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Un'altra cosa riguardo il ritorno di un puntatore...
e se io avessi fatto la funzione in questo modo funzionerebbe lo stesso? Codice:
int * retInt (void) { int a; a = 5; return &a; }; |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
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'.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 558
|
no, per fare una cosa del genere dovresti usare la keyword static! oppure dichiarare la a globalmente (brrrrr)
![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Grazie ad entrambi
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:53.