Вы не можете изменять строковый литерал. Любая попытка изменить строковый литерал приводит к неопределенному поведению.
Из C стандарта (6.4.5 строковых литералов)
7 Не определено, различаются ли эти массивы при условии их элементы имеют соответствующие значения. Если программа пытается изменить такой массив, поведение не определено.
Вы должны объявить размерный массив как
enum { N = 32 };
char str[][N] =
{
"To err is human...",
"But to really mess things up...",
"One needs to know C!!"
};
Обратите внимание к этому функция revreseString слишком сложна. Также лучше, когда функция возвращает указатель на обратную строку. Функция может быть определена следующим образом с помощью указателей
char * reverseString( char *s )
{
if ( *s )
{
for ( char *p = s, *q = s + strlen( s ); p < --q; ++p )
{
char c = *p;
*p = *q;
*q = c;
}
}
return s;
}
Вот демонстрационная программа
#include <stdio.h>
#include <string.h>
char * reverseString( char *s )
{
if ( *s )
{
for ( char *p = s, *q = s + strlen( s ); p < --q; ++p )
{
char c = *p;
*p = *q;
*q = c;
}
}
return s;
}
int main(void)
{
enum { N = 32 };
char s[][N] =
{
"To err is human...",
"But to really mess things up...",
"One needs to know C!!"
};
for ( size_t i = 0; i < sizeof( s ) / sizeof( *s ); i++ )
{
puts( reverseString( s[i] ) );
}
return 0;
}
Вывод программы:
...namuh si rre oT
...pu sgniht ssem yllaer ot tuB
!!C wonk ot sdeen enO