Newsgroup: it.comp.lang.c++
Titolo: Funzioni che ritornano puntatori

Salve a tutti,
avrei un quesito banale da fare. Ho creato un semplicissimo programmino per
spiegare meglio il problema:
#include <iostream.h>
int *retInt();
int main() {
 int *a;
 a = retInt(); // assegno ad a la posizione di var
 cout << *a;
 return 0;
}
int *retInt() {
 int var = 5;
 return &var; // ritorno una locazione di memoria
}
Alla fine della compilazione, il compilatore mi da il seguente warning:
warning C4172: returning address of local variable or temporary
Partendo dal presupposto che una variabile locale rimane in vita solo nel
blocco di codice in cui è dichiarata, la variabile var presente nella
funzione retInt dopo il return viene distrutta. L'area di memoria che prima
occupava, viene solo rilasciata oppure viene anche cancellata ? Cioè, quando
io con la righa a = retInt();
voglio assegnare ad a la posizione di memoria che prima si chiamava var e
quindi avere il suo valore, utilizzo un metodo sicuro oppure le informazioni
presenti possono venir sovrascritte erroneamente ?
Se modifico la funzione int *retInt() in questo modo:
int *retInt() {
  int *var, var2 = 4;
  var = &var2;
  return var;
}
il compilatore non emette più il warning anche se comunque restituisco un
indirizzo di memoria. Sapete forse perchè ?
Grazie per la  risposta.
Simone

 indirizzo di memoria. Sapete forse perchè ?
Qui non stai restituendo un puntatore, stai restituendo un intero ottenuto 
"infilando" il valore di un puntatore in una variabile intera (con perdita 
di informazione o no? ci vorrebbe un cast!).
Spero di non averti annebbiato ulteriormente le idee...
-- 
"Any sufficiently advanced technology is indistinguishable from magic."
                                                            Arthur C. Clarke

 di informazione o no? ci vorrebbe un cast!).
Controlla meglio. A me sembra che stia restituendo comunque l'indirizzo
di una variabile automatica, anche se attraverso un puntatore
esplicitamente definito. Probabilmente il compilatore viene confuso
dalle troppe indirezioni e si dimentica del warning.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 dalle troppe indirezioni e si dimentica del warning.
Si, avevo visto invertite le variabili nella dichiarazione.
8-)


Grazie a tutti per le risposte. Ora la situazione è più chiara.
Saluti
Simone

 restituisco un indirizzo di memoria. Sapete forse perchè ?
sì, è perchè sei così furbo che sei riuscito, nonostante il compilatore 
ti pregasse in ginocchio, per il tuo bene, di non farlo, a spararti nel 
piede. Stai facendo una cosa così brutta che fa ululare i cani, nitrire 
i cavalli e piangere i bambini. Ripassati i tre tipi di allocazione del 
C++, sforzati di capire i concetti di "stack" e "record di attivazione"
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.0. C, C++ and ASM developers
                               and beta testers are welcome!

 dovrebbe denunciarti ad Amnesty International, anzichč darti un warning
ROTFL !
8-D
