strcpy() вызывает ошибку сегментации?

Возможный дубликат:
Получение ошибки сегментации

Почему этот код вызывает ошибку сегментации?

char *text = "foo";
strcpy(text, "");

Насколько я понимаю, первая строка выделяет некоторую память (для хранения строки «foo»), а text указывает на эту выделенную память. Вторая строка копирует пустую строку в место, на которое указывает text.

Этот код может не иметь большого смысла, но почему он терпит неудачу?


person Thomas    schedule 22.09.2011    source источник
comment
Посмотрите на результаты поиска. ПОСМОТРИТЕ НА НИХ!@#! stackoverflow.com/search?q=strcpy+segmentation+fault   -  person flight    schedule 22.09.2011
comment
Какой лучший дубликат? Я не мог легко найти его.   -  person erisco    schedule 22.09.2011
comment
НЕ все они являются точными дубликатами, но ошибки, как правило, одинаковы.   -  person Mysticial    schedule 22.09.2011
comment
Я согласен с Джоном Кугельманом. Перехожу к закрытию для дублирования.   -  person erisco    schedule 22.09.2011
comment
@quasiverse: Прежде чем задать этот вопрос, я увидел, что здесь на SO много подобных вопросов, но почти все они наоборот, а именно объявление char *text; без выделения памяти.   -  person Thomas    schedule 22.09.2011


Ответы (3)


Всякий раз, когда у вас есть строковый литерал (в вашем случае «foo»), программа сохраняет это значение в разделе памяти только для чтения.

strcpy хочет изменить это значение, но оно доступно только для чтения, отсюда и ошибка сегментации.

Кроме того, text должно быть const char*, а не char*.

person Marlon    schedule 22.09.2011

Поскольку строковый литерал (например, "foo") только для чтения.

person Oliver Charlesworth    schedule 22.09.2011

Поскольку строковые литералы хранятся в области памяти только для чтения.

Таким образом, попытка модификации foo (в данном случае с использованием strcpy) является неопределенным поведением.

person iammilind    schedule 22.09.2011