Я пытаюсь понять, где вещи хранятся в памяти (стек/куча, есть ли другие?) при запуске программы c. При компиляции выдается предупреждение: функция возвращает адрес локальной переменной:
char *giveString (void)
{
char string[] = "Test";
return string;
}
int main (void)
{
char *string = giveString ();
printf ("%s\n", string);
}
Запуск дает разные результаты, просто печатает тарабарщину. Из этого я понял, что массив символов, называемый строкой в функции giveString(), сохраняется в кадре стека функции giveString() во время ее работы. Но если я изменю тип строки в giveString() с массива char на указатель char:
char *string = "Test";
Я не получаю предупреждений, и программа выводит «Тест». Значит ли это, что строка символов «Test» теперь находится в куче? Он определенно больше не находится в кадре стека giveString(). Что именно происходит в каждом из этих двух случаев? И если эта строка символов расположена в куче, так что все части программы могут получить к ней доступ через указатель, будет ли она никогда не освобождена до завершения программы? Или освободилось бы место в памяти, если бы на него не было указателей, например, если бы я не вернул указатель на main? (Но это возможно только со сборщиком мусора, как в Java, верно?) Является ли это особым случаем выделения кучи, который применим только к указателям на постоянные строки символов (жестко запрограммированные строки)?