Вопрос по string, c – Изменить строковый литерал в C через указатель? [Дубликат]

1

Possible Duplicate:
Why do I get a segmentation fault when writing to a string?

У меня есть следующая программа:

<code>char *s     = "abcdf";
char s1[50] = "abcdf";

s1[0] = 'Q';   // Line 1
s[0] = 'P';    // Line 2
</code>

ЗачемLine 1 работал правильно иLine 2 вызвал сбой программы?

Ваш Ответ

2   ответа
3
char *s = "abcdf";
char s1[50] = "abcdf";
s1[0] = 'Q'; // Line 1
s[0] = 'P'; // Line 2 

Вот,s является гарантируемым изменяемым указателем, который может быть глобальной или локальной переменной стека, в зависимости от того, поместите ли вы это определение в область действия программы или внутри функции. Прежде чем вы начнете использовать его, компилятор долженaddress текста "abcdf" быть загруженным вs, Обычно в современных операционных системах «abcdf» сам будет находиться в области постоянной памяти, где находится «загрузчик»; который читает файл программы в память при подготовке к выполнению, говорит самому ЦПУ разрешить операции чтения, но не записи. Такs - который может быть изменен - указывает на "abcdf" который не.

s1 является гарантированным изменяемым массивом из 50 символов. Прежде чем вы начнете использовать его, компилятор должен подготовить текст "abcdf". бытьcopied в этот модифицируемый буфер. Затем вы можете безопасно изменить этот буфер, как вы делаете сs1[0] = 'Q'.

s[0] = 'P' использует указательs найти исходный неизменяемый / постоянный текст "abcdf" в постоянной памяти, а затем пытается изменить его. Как упомянуто выше, ЦПУ, как правило, будет настроен на реагирование путем генерации исключения ЦП / прерывания / сигнала / прерывания (терминология отличается от производителя). Ваша программа не удастся.

5

Строка 2 указывает на раздел данных вашего исполняемого файла, который доступен только для чтения, тогда как в строке 1 программа инициализируетs1 массив с заданной строкой. Это хранится в стеке, который вы можете изменить.

Похожие вопросы