|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
[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?
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12869
|
Quote:
Comunque: Codice:
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. */
}
|
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Ti riferisci per caso a come viene tradotto in assembly! Se è così da uno sguardo a questo documento http://www.dis.uniroma1.it/~demetres...oad/aebook.pdf
su questo invece http://eli.thegreenplace.net/2011/09...out-on-x86-64/ si parla solo di stack frame, però è fatto bene |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
Quote:
Quote:
|
||
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2285
|
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) Quote:
se ti interessa approfondire trovi una breve spiegazione nella "bibbia" ( a.k.a. "the c++ programming language" di stroustrup )
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
Quote:
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12869
|
Quote:
"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". Ultima modifica di WarDuck : 08-09-2011 alle 22:09. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Totalmente d'accordo con WarDuck. Anche perchè una funzione del genere altrimenti cosa ritornerebbe??
Codice:
unsigned long indirizzo(){
return malloc(1);
}
Codice:
unsigned long indirizzo(){
int a = 10;
return &a;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:23.












)








