Проблема в том, что вы пытаетесь изменить строковый литерал "abc"
с помощью:
char *a="abc",*ptr;
ptr=a; // ptr points to the 'a'.
ptr++; // now it points to the 'b'.
*ptr='k'; // now you try to change the 'b' to a 'k'.
Это неопределенное поведение. Стандарт прямо заявляет, что вам не разрешено изменять строковые литералы в соответствии с разделом 6.4.5 String literals
C99:
Не определено, различаются ли эти массивы при условии, что их элементы имеют соответствующие значения. Если программа пытается изменить такой массив, поведение не определено.
Это будет работать, если вы замените:
char *a="abc",*ptr;
с:
char a[]="abc",*ptr;
, поскольку он копирует строковый литерал в место, которое безопасно изменить.