2015-11-13 6 views
-2

Рассмотрим следующее определение:Распределение памяти в стеке и тексте?

char A[]="xyz"; 

Как мы все знаем, что выделяется 4 байта памяти в секции стека, когда А определяется, как указано выше. В то же время адрес «xyz» хранится в разделе кода?

+0

В чем вопрос? – iqstatic

+0

будет «xyz» постоянным указателем, будет ли он сохранен в текстовом разделе – yedukondalu

ответ

1

Как правило, строковые литералы хранятся в постоянной памяти при запуске программы. Это предотвратит случайное изменение строковой константы. «Постоянная память», на которую я имею в виду, - это текстовый сегмент в терминах ASM. Это то же место в памяти, где загружаются инструкции. Это доступно только для чтения по очевидным причинам, таким как безопасность. Когда вы создаете char*, инициализированный для строки, строковые данные скомпилируются в текстовый сегмент, и программа инициализирует указатель для указания в текстовый сегмент. Поэтому, если вы попытаетесь изменить его, вы получите Segfault. Однако при написании в виде массива (как в вашем примере) компилятор помещает инициализированные строковые данные в сегмент данных, а это означает то же самое место, что и ваши глобальные переменные и т. Д. Эта память изменена, поскольку в сегменте данных нет инструкций. На этот раз, когда компилятор инициализирует массив символов (который все еще является символом char *), он указывает на сегмент данных, а не на текстовый сегмент, который можно безопасно изменить во время выполнения.

+0

Будет ли инициализирован массив символов в сегменте данных или сегменте стека. В приведенном выше примере A (массив символов) является переменной класса автоматического хранения. – yedukondalu

Смежные вопросы