C Строковые литералы создаются в стеке? - PullRequest
4 голосов
/ 15 февраля 2010

Я немного озадачен этим выражением:

char *s = "abc";

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

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

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

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

char s[] = "abc";

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

Ответы [ 3 ]

21 голосов
/ 15 февраля 2010

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

6 голосов
/ 15 февраля 2010
"abc"

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

char *s = "abc";

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

3 голосов
/ 15 февраля 2010

«Стеки» и «кучи» являются деталями реализации и зависят от платформы (весь мир - , а не x86). От языка POV важны класс и степень хранения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...