Где будет выделяться память для строки в C - PullRequest
6 голосов
/ 03 ноября 2011

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

char* ptr="Hello";//ptr is a automatic variable

тогда переменная-указатель ptr будет размещена в стеке, но где будет эта строка "Hello"быть выделенным.Это в стеке или в куче?А как насчет выделения памяти для оператора инициализации, например char ptr [] = "Hello";

Ответы [ 2 ]

12 голосов
/ 03 ноября 2011

Стандарт не говорит (он не знает о «стеке», «куче» и т. Д.). Но на практике ответ таков: ни то, ни другое. Строковый литерал будет храниться в разделе данных, обычно на странице только для чтения.

В качестве примечания, как упоминает Алс в комментариях, попытка изменить строковый литерал - неопределенное поведение.

3 голосов
/ 03 ноября 2011

Со статическими строками, как в вашем примере, строка на самом деле не выделена. Пространство для него создается в самом исполняемом файле, и приведенное выше присваивание просто устанавливает «ptr» в адрес этого пространства.

Я не уверен, зависит ли это от реализации или нет, но строка обычно находится в защищенной памяти, поэтому вы не можете ее изменить ... только укажите на нее.

В UNIX вы можете увидеть статические строки в исполняемом файле, используя команду "strings" в исполняемом файле.

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