C создаются ли строковые литералы в стеке?
Меня немного смущает это выражение:
char *s = "abc";
Создается ли строковый литерал в стеке?
Я знаю, что это выражение
char *s = (char *)malloc(10 * sizeof(char));
Выделяет память в куче и это выражение
char s[] = "abc";
Выделяет память в стеке, но я совершенно не уверен, что делает первое выражение.
3 ответа:
Обычно строковый литерал
"abc"
хранится в части исполняемого файла, доступной только для чтения. Указательs
будет создан в стеке (или помещен в регистр, или просто оптимизирован) - и укажет на тот строковый литерал, который живет "в другом месте".
"abc"
Строковые литералы хранятся в разделе
__TEXT,__cstring
(илиrodata
или в любом другом, зависящем от формата объекта) вашей программы, если включено объединение строк. Это означает, что он не находится ни в стеке, ни в куче, а находится в области памяти, доступной только для чтения, рядом с вашим кодом.char *s = "abc";
Этому оператору будет присвоено место в памяти строкового литерала
"abc"
s
, т. е.s
указывает на область памяти, доступную только для чтения.
"стеки" и "кучи" являются деталями реализации и зависят от платформы (весь мир Не x86). С точки зрения языка, что имеет значение, так это класс хранения и степень.
Строковые литералы имеют статический экстент; память для них выделяется при запуске программы и хранится до завершения работы программы. Также предполагается, что строковые литералы не могут быть изменены (попытка сделать это вызывает неопределенное поведение). Сравните это с локальными, блочными (автоматическими) переменными, чье хранилище выделяется при входе в блок и освобождается при выходе из блока. Обычно это означает, что строковые литералы не хранятся в той же памяти, что и переменные области действия блока.