2012-06-21 14 views
5

No entiendo cómo este ejemplo, posiblemente, puede trabajar:devolviendo un puntero

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

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

} 

salary es una variable local en GetSalary(), por tanto, después de regresar de la función, esta célula podría posiblemente ser sobrescrito por otra función. No veo cómo puede funcionar alguna vez devolver un puntero a una variable local (no instanciado en el montón).

+6

Sí, es posible que se sobrescriba. O tal vez no. Es por eso que esto se llama ** comportamiento indefinido **, en lugar de ** bloqueo garantizado **. –

+0

es gracioso que el código obove sea el primer resultado cuando google "retornando el puntero a una función" – user695652

+0

A menudo obtengo lo mismo. Tengo la idea de que Google cambia tu burbuja de búsqueda cuando inicias sesión en SO con una cuenta de Google. –

Respuesta

16

No funciona. Es un comportamiento indefinido. Puede parecer que funciona, porque "comportamiento correcto" es un subconjunto de "cualquier comportamiento posible".

8

Te encuentras con un comportamiento indefinido, lo que significa puede pasar cualquier cosa. Incluyendo aparecer a trabajar.

Fuera de la función, el puntero de retorno está colgando (es decir, la memoria a la que apunta no es válida).

Por qué parece que todo se reduce a la implementación. Lo más probable es que la memoria no se borre. Por lo tanto, aunque no tenga acceso a lo que apunta el puntero de retorno, en esa memoria todavía existe el 26.48. Pero es solo por casualidad

1

No "funciona", es desreferenciar un puntero que ya no es válido. El hecho de que la memoria apuntada mantenga el valor esperado no es un signo de que el programa "funcione" en su totalidad o sea correcto.

Para entender por qué funciona, debe analizar el patrón exacto de los cambios de marco de pila que tienen lugar, lo cual es un poco molesto y muy dependiente del compilador.

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 
} 

Debido pila función ha sido sobrescrito por la segunda llamada a la función dummy_function

0

Esto también funciona, pero es mucho más seguro. No funcionará correctamente en un programa multiproceso.

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