Estoy tratando de entender cómo funciona devolviendo un puntero en los siguientes escenarios:Tratar de entender cómo funciona un tipo de retorno puntero
#include <iostream>
using namespace std;
// Why does this work? I can even pass the return value to another function
// and the contents do not change.
char* StringFromFunction()
{
char* pReturn = "This string was created in the function.";
return pReturn;
}
// I know this is wrong because the memory address where 5 is stored can be
// overwritten.
int* IntegerFromFunction()
{
int returnValue = 5;
return &returnValue;
}
int main()
{
int* pInteger;
char* pString;
pString = StringFromFunction();
pInteger = IntegerFromFunction();
cout << *pInteger << endl << pString << endl;
return 0;
}
La salida del programa es como yo esperaba que fuera:
5
This string was created in the function.
La única advertencia del compilador que recibo en Visual C++ 2010 Express es "c: \ vc2010projects \ test \ main.cpp (14): advertencia C4172: devolución de la dirección de la variable local o temporal" y solo se muestra cuando uso IntegerFromFunction()
y no StringFromFunction()
.
Lo que creo que estoy entendiendo a partir de los ejemplos anteriores es el siguiente:
Dentro StringFromFunction()
, la asignación de memoria para el texto "Esta cadena fue creado en la función." ocurre en el momento de la ejecución y porque es un literal de cadena, el contenido persiste en la memoria incluso después de que la función retorna, y es por eso que el puntero pString
en main()
se puede pasar a otra función y la cadena se puede mostrar dentro de ella.
Sin embargo, para el IntegerFromFunction()
, cuando la función retorna, la memoria asignada se libera y, por lo tanto, esa dirección de memoria se puede sobrescribir.
Supongo que mi pregunta principal es, ¿pueden los punteros que apuntan a los literales de cadena pasar con seguridad a través del programa?
intente también: char * StringFromFunction() { char [] pReturn = "Esta cadena se ha creado en la función."; return pReturn; } – stmax