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