Строковые литералы читаются только на C. Ну, не совсем, но на практике они есть.Поэтому измените
char* str = "bananas";
на
char str[] = "bananas"; // Store as an array and not a pointer
или
char* str = strdup("bananas"); // Dynamically allocate. Don't forget to free
. Это один из случаев, когда становится очевидным, что массивы не являются указателями
Стандарт не предусматривает, что строковые литералы только для чтения, но с другой стороны, он также не говорит об обратном.И на практике строковые литералы оказываются в области только для чтения в большинстве реализаций Си.Технически они имеют тип char[]
, что подразумевает, что их следует изменять, но изменение (или попытка изменить) их является неопределенным поведением, поэтому избегайте этого.
http://port70.net/~nsz/c/c11/n1570.html#6.4.5p7
Если программа пытается изменить такой массив, поведение не определено.
Три других комментария о вашем коде:
Приведение в (int)(length / 2)
совершенно не нужно.Просто напишите length / 2
, поскольку это уже целое число.
Не нужно писать собственную функцию для определения длины строки.Просто напишите length = strlen(str)
.
Пропустить return 0
.Используйте оператор return только в main
, если вы хотите выйти до конца или если вы хотите вернуть что-то отличное от 0. Это было нормально с C99.