C создаются ли строковые литералы в стеке?


Меня немного смущает это выражение:

char *s = "abc";

Создается ли строковый литерал в стеке?

Я знаю, что это выражение

char *s = (char *)malloc(10 * sizeof(char));

Выделяет память в куче и это выражение

char s[] = "abc";

Выделяет память в стеке, но я совершенно не уверен, что делает первое выражение.

3 4

3 ответа:

Обычно строковый литерал "abc" хранится в части исполняемого файла, доступной только для чтения. Указатель s будет создан в стеке (или помещен в регистр, или просто оптимизирован) - и укажет на тот строковый литерал, который живет "в другом месте".

"abc"

Строковые литералы хранятся в разделе __TEXT,__cstring (или rodata или в любом другом, зависящем от формата объекта) вашей программы, если включено объединение строк. Это означает, что он не находится ни в стеке, ни в куче, а находится в области памяти, доступной только для чтения, рядом с вашим кодом.

char *s = "abc";

Этому оператору будет присвоено место в памяти строкового литерала "abc" s, т. е. s указывает на область памяти, доступную только для чтения.

"стеки" и "кучи" являются деталями реализации и зависят от платформы (весь мир Не x86). С точки зрения языка, что имеет значение, так это класс хранения и степень.

Строковые литералы имеют статический экстент; память для них выделяется при запуске программы и хранится до завершения работы программы. Также предполагается, что строковые литералы не могут быть изменены (попытка сделать это вызывает неопределенное поведение). Сравните это с локальными, блочными (автоматическими) переменными, чье хранилище выделяется при входе в блок и освобождается при выходе из блока. Обычно это означает, что строковые литералы не хранятся в той же памяти, что и переменные области действия блока.