View Full Version : [C] domanda tecnica sul "return"
Se io pongo un return accompagnato da una etichetta di una variabile in una funzione, quella etichetta e il valore contenuto nella variabile come vengono trattati? Dove vengono allocati? Lo standard C pre-Ansi cosa specifica a riguardo?
Se io pongo un return accompagnato da una etichetta di una variabile in una funzione, quella etichetta e il valore contenuto nella variabile come vengono trattati? Dove vengono allocati? Lo standard C pre-Ansi cosa specifica a riguardo?
Dovresti spiegarti meglio con un esempio.
Comunque:
int func()
{
int a = 5; // variabile allocata nello stack della funzione
return a; // restituisce una copia del contenuto di a, quindi 5.
}
int* func()
{
int a = 5; // variabile allocata nello stack della funzione
return &a;
/* restituisce l'indirizzo di a, che però è nello stack della funzione, ergo molto probabilmente non sarà valido fuori dalla funzione. */
}
clockover
08-09-2011, 09:34
Ti riferisci per caso a come viene tradotto in assembly! Se è così da uno sguardo a questo documento http://www.dis.uniroma1.it/~demetres/didattica/ae/upload/aebook.pdf
su questo invece http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ si parla solo di stack frame, però è fatto bene :D
Dovresti spiegarti meglio con un esempio.
Comunque:
int func()
{
int a = 5; // variabile allocata nello stack della funzione
return a; // restituisce una copia del contenuto di a, quindi 5.
}
int* func()
{
int a = 5; // variabile allocata nello stack della funzione
return &a;
/* restituisce l'indirizzo di a, che però è nello stack della funzione, ergo molto probabilmente non sarà valido fuori dalla funzione. */
}
penso che clockover ci sia andato più vicino, comunque sia, per quanto riguarda l'operatore & non è corretto dire che restituisce un indirizzo, restituisce un puntatore che ha come contenuto l'indirizzo della variabile la cui etichetta è posta alla destra dell'operatore.
Ti riferisci per caso a come viene tradotto in assembly! Se è così da uno sguardo a questo documento http://www.dis.uniroma1.it/~demetres/didattica/ae/upload/aebook.pdf
su questo invece http://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64/ si parla solo di stack frame, però è fatto bene :D
adesso li leggo, si cercavo una cosa del genere, grazie :)
ciao
solo una precisazione: una reference è un concetto diverso da un puntatore
in quanto non è un tipo (com'è un puntatore) ma semplicemente un alias ad una variabile e le differenze ci sono (ptr può essere nullo mentre la reference no, la sizeof, gli operatori che non si applicano)
restituisce un puntatore che ha come contenuto l'indirizzo della variabile la cui etichetta è posta alla destra dell'operatore
questo non è esattamente vero: dipende dall'implementazione nel compilatore, ovvio che quella più ovvia è un const ptr ma non è garantita questa cosa ;)
se ti interessa approfondire trovi una breve spiegazione nella "bibbia" ( a.k.a. "the c++ programming language" di stroustrup :ave: ) :D
ciao
solo una precisazione: una reference è un concetto diverso da un puntatore
in quanto non è un tipo (com'è un puntatore) ma semplicemente un alias ad una variabile e le differenze ci sono (ptr può essere nullo mentre la reference no, la sizeof, gli operatori che non si applicano)
questo non è esattamente vero: dipende dall'implementazione nel compilatore, ovvio che quella più ovvia è un const ptr ma non è garantita questa cosa ;)
se ti interessa approfondire trovi una breve spiegazione nella "bibbia" ( a.k.a. "the c++ programming language" di stroustrup :ave: ) :D
lo so, ma considerando il compilatore come variabile non si potrebbe studiare il C e il C++, si considera sempre il GCC come compilatore "standard" dato che è quello "affidabile e gratuito" sulla piazza cioé quello più diffuso, anche perché un compilatore per tanti altri comandi potrebbe tradurre in assembly come gli pare e piace, di possibili varianti ce ne sono tante.
penso che clockover ci sia andato più vicino, comunque sia, per quanto riguarda l'operatore & non è corretto dire che restituisce un indirizzo, restituisce un puntatore che ha come contenuto l'indirizzo della variabile la cui etichetta è posta alla destra dell'operatore.
Credo ci si possa permettere la licenza di sostituire il contenitore per il contenuto :sofico: . Comunque dal mio punto di vista la questione è irrilevante.
"Puntatore" è solo un nome come un altro per definire una variabile che contiene un indirizzo, per me quella funzione ritorna a tutti gli effetti un indirizzo di memoria (il cui contenuto può essere più o meno valido ma questo è un'altro discorso)...
Comunque relativamente alla questione del return, tipicamente (almeno nell'assembly MIPS è così) il valore di ritorno viene collocato in un registro particolare dedicato allo scopo così da poter essere utilizzato.
Un bell'esercizio per imparare l'assembly è creare funzioni ricorsive, lì capisci veramente bene come vengono gestiti stack e registri "temporanei".
clockover
09-09-2011, 00:15
Totalmente d'accordo con WarDuck. Anche perchè una funzione del genere altrimenti cosa ritornerebbe??
unsigned long indirizzo(){
return malloc(1);
}
ma anche questa (a prescindere dalla sua validità)
unsigned long indirizzo(){
int a = 10;
return &a;
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.