Я пытаюсь понять, как возврат указателя работает в следующих сценариях:
#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;
}
Вывод программы такой, каким я и ожидал:
5
This string was created in the function.
Единственное предупреждение компилятора, которое я получаю в Visual C ++ 2010 Express: " c: \ vc2010projects \ test \ main.cpp (14): предупреждение C4172: возвращение адреса локальной переменной или временной ", и это отображается только тогда, когда я использую IntegerFromFunction ()
, а не ] StringFromFunction ()
.
Я думаю, что я понял из приведенных выше примеров следующее:
Внутри StringFromFunction ()
выделение памяти для текста «Эта строка была создана в функции». происходит во время выполнения, и поскольку это строковый литерал, его содержимое сохраняется в памяти даже после возврата из функции, поэтому указатель pString
в main ()
может быть передан в в ней может отображаться другая функция и строка.
Однако для IntegerFromFunction ()
, когда функция возвращает, выделенная память теперь освобождается, и, следовательно, этот адрес памяти может быть перезаписан.
Думаю, мой главный вопрос: можно ли безопасно передавать указатели, указывающие на строковые литералы, по всей программе?