Если вы определяете строку как:
char *str1 = "apple";
вам не разрешено изменять содержимое - стандарт совершенно ясно, что это неопределенное поведение (a) . Использование:
char str1[] = "apple";
вместо этого, и он даст вам изменяемую копию. Это функционально эквивалентно:
char str1[6]; strcpy (str1, "apple");
(a) C99 6.4.5 "String literals"
, пункт 6
гласит:
Не определено, различаются ли эти массивы при условии, что их элементы имеют соответствующие значения. Если программа пытается изменить такой массив, поведение не определено.