|
|
|
![]() |
|
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: 12840
|
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: 12840
|
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 21: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: 20:48.