Ошибка сегментации при использовании tolower() на динамических массивах

Я поместил этот код на мой компилятор C (Dev Cpp).

char *str = "SomeTHing";
for(int i = 0; str[i]; i++){
   str[i] = tolower(str[i]);
}

Это дает ошибку сегментации, тогда как если я использую статический массив,

char str[10] = "SomeTHing";

петля работает нормально. Кто-нибудь может сказать, почему это происходит?

2 ответа

char *str = "SomeTHing"; выделяет постоянную память для указателя str, Изменять его содержимое каким-либо образом - это неопределенное поведение. В вашей системе это проявляется как сбой. Жаль, что (i) ваш компилятор не предупреждает вас о назначении этого char* а не const char* или (ii) вы игнорируете предупреждение.

char str[10] = "SomeTHing"; выделяет буфер в стеке, включая нулевой терминатор. Изменение его содержимого определено, хотя вам необходимо сохранить нулевой терминатор без изменений, если вы хотите использовать некоторые функции библиотек строк, такие как strlen что полагаться на это.

char *str = "SomeTHing";

разместит SomeTHing в только для чтения части памяти и делая str указатель на это, что делает любую операцию записи в эту память недопустимой. Любая попытка изменить эту причину Неопределенное поведение.

Теперь следующий случай

char str[10] = "SomeTHing";

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

Другие вопросы по тегам