Функция недействительна, но достаточно указать, что программа в любом случае имеет неопределенное поведение, поскольку она пытается изменить строковый литерал, а модификация строкового литерала приводит к неопределенному поведению.
char * String = malloc(512);
String = "Blobfish is the best creature ever made by nature";
CutString(String, 3, 4);
//...
Кроме того, происходит утечка памяти, поскольку сначала выделяется память, а указатель на память назначается указателю String. И тогда указатель String был переназначен с адресом строкового литерала. Таким образом, адрес выделенной памяти теряется.
Что касается функции, то ее можно определить следующим образом, как показано в демонстрационной программе ниже.
#include <stdio.h>
#include <string.h>
char * CutString( char * s, size_t pos, size_t n )
{
size_t length = strlen( s );
if ( pos < length )
{
n = length - pos < n ? length - pos : n;
memmove( s + pos, s + pos + n, length - pos - n + 1 );
}
return s;
}
int main(void)
{
char s[] = "Blobfish is the best creature ever made by nature";
puts( s );
puts( CutString( s, 3, 4 ) );
return 0;
}
Вывод программы is
Blobfish is the best creature ever made by nature
Bloh is the best creature ever made by nature
Обратите внимание на то, что нет особого смысла, когда функция имеет тип возврата bool. Гораздо лучше, когда такая функция возвращает указатель на саму строку после ее модификации. Все стандартные строковые функции C следуют этому соглашению.