2014-09-18 4 views
-1

Я поместил этот код в свой компилятор C (Dev Cpp).Ошибка сегментации при использовании tolower() для динамических массивов

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

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

char str[10] = "SomeTHing"; 

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

+0

он может быть воспроизведен без 'tolower'. стремиться к минимальному примеру. –

+1

Где динамические массивы! – user1336087

ответ

4
char *str = "SomeTHing"; 

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

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

char str[10] = "SomeTHing"; 

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

5

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

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