Я знаю, что если мы объявим переменные внутри функции, не выделяя для них память, они будут потеряны после того, как функция завершит свою работу.
Следующий код напечатает:
(null)
5
char* getString()
{
char arr[] = "SomeText";
return arr;
}
int getInt()
{
int b = 5;
return b;
}
int main()
{
printf("%s", getString());
printf("\n");
printf("%d", getInt());
return 0;
}
Обе переменные arr
и b
создаются в стеке, поэтому они обе должны быть уничтожены по завершении функций. У меня вопрос: почему переменная b
не теряется, а переменная arr
потеряна?
getInt()
возвращает значение, а функцияgetString()
возвращает указатель (... на область памяти, которая была удалена). Попробуйтеint *getInts() { int x[2] = {-1, 42}; return x; }
- person pmg   schedule 09.11.2019b
потеряна, но ее значение возвращается функцией. Будет такая же ситуация, как и сarr
, если вы вернете указатель наb
. - person Weather Vane   schedule 09.11.2019std::string
. Указатели - это строительные блоки для классов.std::string
, вероятно, содержит несколько указателей внутри. Тебя это не волнует. - person MSalters   schedule 09.11.2019getInt()
достигает оператораreturn b;
, он помещает внутрь конверта значение, содержащееся в переменнойb
в то время. ФункцияgetString()
помещает внутрь конверта что-то вроде0xdeadbeef
(распавшийсяarr
). - person pmg   schedule 09.11.2019getInt()
возвращает целочисленное значение, аgetString()
возвращает значениеchar*
. К сожалению, возвращаемое значениеchar*
- это адрес массива, который вышел за пределы области видимости и больше не существует. - person Blastfurnace   schedule 09.11.2019