Преобразование строки char * в нижний регистр с помощью tolower () вызывает SIGSEGV - что не так?

Я нашел следующий код в устаревшем проекте, который, кажется, вызывает некоторые проблемы:

for( ; *str; ++str )
    *str = tolower(*str);

Проблема в том, что мы получаем SIGSEGV в тот момент, когда результат tolower () должен быть записан обратно в * str. Это то, что я получил при использовании отладки printf () и stracktrace, так как мы используем здесь JNI и, таким образом, подключение отладчика к библиотекам C для нас не работает.

Код не работает, если он скомпилирован с помощью gcc в Linux. Выполнение того же самого в Windows (для этой настройки кросс-платформенной платформы используется CMake) работает нормально.

Где я могу найти причину этого? Любые подсказки приветствуются :)

спасибо - Маркус


person Markus    schedule 10.04.2012    source источник
comment
На что указывает str? Не строковая константа?   -  person Michael Krelin - hacker    schedule 10.04.2012
comment
Он передан в мою функцию: myfunction (char * str)   -  person Markus    schedule 10.04.2012
comment
'my function' = ›Вы не контролируете вызывающего абонента?   -  person ArjunShankar    schedule 10.04.2012
comment
Майкл хотел сказать, что изменение строковых констант может привести к ошибкам сегментации. Вот почему: stackoverflow.com/questions/164194/   -  person ArjunShankar    schedule 10.04.2012
comment
Да, это то, что я (а позже @ouah в ответе) хотел сказать ;-)   -  person Michael Krelin - hacker    schedule 10.04.2012
comment
Хм, не совсем. с. Большое спасибо за ваши быстрые ответы!   -  person Markus    schedule 10.04.2012


Ответы (1)


Строковые литералы нельзя изменить:

char blop[] = "modifiable string";
char *bla = "non-modifiable string";

*blop = tolower(*blop); // OK
*bla = tolower(*bla);   // not OK, modifying a string literal
person ouah    schedule 10.04.2012
comment
+1, но функция tolower() не ожидает char* и ничего не изменяет ;-) То, что вы имели в виду, - это то, что OP в комментариях выше называет myfunction(). - person Michael Krelin - hacker; 10.04.2012
comment
Спасибо, ребята, за быстрые и полезные ответы, мне это очень помогло! - person Markus; 10.04.2012