2012-06-21 16 views
5

non capisco come questo esempio può eventualmente funzionare:Tornando un puntatore

double * GetSalary() { 
    double salary = 26.48; 
    return &salary; 
} 

main() { 
    cout << *GetSalary(); //prints 26.48 

} 

salary è una variabile locale in GetSalary(), quindi dopo il ritorno dalla funzione, questa cella potrebbe eventualmente essere sovrascritta da un'altra funzione. Non vedo come restituire un puntatore a una variabile locale (non installato nell'heap) possa mai funzionare.

+6

Sì, potrebbe essere sovrascritto. O potrebbe non farlo. Ecco perché questo è chiamato ** comportamento non definito **, piuttosto che un ** crash garantito **. –

+0

è divertente che il codice di obove sia il primo risultato quando google "restituisce il puntatore forma una funzione" – user695652

+0

Spesso ottengo la stessa cosa. Ho l'impressione che Google modifichi il tuo fumetto di ricerca quando hai effettuato l'accesso a SO con un account Google. –

risposta

16

Non funziona. È un comportamento indefinito. Può sembrare che funzioni, perché "comportamento corretto" è un sottoinsieme di "qualsiasi comportamento possibile".

8

Si sta verificando un comportamento non definito, ovvero può accadere qualsiasi cosa. Compreso l'apparire al lavoro.

Al di fuori della funzione, il puntatore di ritorno pende (vale a dire che la memoria a cui punta non è valido).

Perché sembra funzionare riduce all'implementazione. Molto probabilmente la memoria non viene cancellata. Quindi anche se non si ha accesso a ciò a cui punta il puntatore di ritorno, in quella memoria esiste ancora 26.48. Ma è solo per caso.

1

Non funziona ", sta dereferenziando un puntatore che non è più valido. Il fatto che la memoria puntata su di esso mantenga il valore atteso non è un segno del programma nel suo complesso "funzionante" o corretto.

Per comprendere il motivo per cui funziona, è necessario analizzare il modello esatto degli spostamenti del frame dello stack che si verificano, il che è piuttosto fastidioso e molto dipendente dal compilatore.

2
double * GetSalary() 
{ 
    double salary = 26.48;  
    return &salary; 
} 
double dummy_function() 
{ 
    double a = 1.1; 
    double b = 2.2; 
    double c = 0 , d = 0; 

    c = a + b - d; 
    return c; 
} 

main() 
{  
    double *a; 
    a = GetSalary(); 
    cout << dummy_function(); 
    cout << *a; //this time it wont print 26.48 
} 

A causa dello stack funzione è stato sovrascritto dal secondo funzione di chiamata dummy_function

0

Questo funziona anche, ma è molto più sicuro. Non funzionerà correttamente in un programma multi-thread.

double * GetSalary() { 
    static double salary = 26.48; 
    return &salary; 
}