Пытаюсь понять, как работает возвращаемый тип указателя

Я пытаюсь понять, как возврат указателя работает в следующих сценариях:

#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 () , когда функция возвращает, выделенная память теперь освобождается, и, следовательно, этот адрес памяти может быть перезаписан.

Думаю, мой главный вопрос: можно ли безопасно передавать указатели, указывающие на строковые литералы, по всей программе?

10
задан Bill the Lizard 18 September 2012 в 14:07
поделиться