Страницы

Поиск по вопросам

четверг, 18 октября 2018 г.

C++: изменение символа строкового литерала

#include
int main() { char* str = "qwerty"; str[0] = '1'; std::cout << str << std::endl; return 0; }
Этот код выдает ошибку access violation. В чем дело? Почему нельзя изменить символ простой не-const строки?
UPD: код сработал при такой инициализации строки: char str[]. Но в чем разница?


Ответ

Строковые константы в коде могут размещаться где-то в отдельном блоке памяти (в дата-секции исполняемого файла, например), который может быть отмечен как "только для чтения". Модифицировать их нельзя, это undefined behavior. Хотя на некоторых компиляторах в некоторых осях при определённых условиях это и может работать, но полагаться на это нельзя.
Если хотите иметь модифицируемую строку, то скопируйте её или объявите как массив (не как указатель).
См. Why is this string reversal C code causing a segmentation fault?

Комментариев нет:

Отправить комментарий