В этом объявлении
char * p = "dudu";
указатель p
инициализируется адресом первого символа строкового литерала "dudu"
.
Внутри функции func
youпытаются изменить строковый литерал с помощью указателя.
Строковые литералы неизменны в C (и C ++).Любая попытка изменить строковый литерал приводит к неопределенному поведению.
Чтобы сделать код действительным, вам нужно использовать массив символов, например,
char s[] = "dudu";
Другой способ - динамическое выделение массива.и сохраните в нем строку, например,
const char *p = "dudu";
char *s = malloc( strlen( p ) + 1 );
strcpy( s, p );
Учтите, что гораздо лучше переписать функцию func
следующим образом
char * func( char *s )
{
for ( size_t i = 0, n = strlen( s ); i < n / 2; i++ )
{
char c = s[n - i - 1];
s[n - i - 1] = s[i];
s[i] = c;
}
return s;
}
и назвать ее как
puts( func( s ) );
Вот демонстрационная программа
#include <stdio.h>
#include <string.h>
char * func( char *s )
{
for ( size_t i = 0, n = strlen( s ); i < n / 2; i++ )
{
char c = s[n - i - 1];
s[n - i - 1] = s[i];
s[i] = c;
}
return s;
}
int main( void )
{
char s[] = "Hello JustAskingSmartPeople";
puts( s );
puts( func( s ) );
}
Вывод программы
Hello JustAskingSmartPeople
elpoePtramSgniksAtsuJ olleH