Строковые литералы (ваш "Shiv") не могут быть изменены.
Вы назначаете указателю адрес такого строкового литерала, затем пытаетесь изменить содержимое строкового литерала путем разыменования значения указателя. Это большое НЕТ-НЕТ.
Вместо этого объявите str как массив:
char str[] = "Shiv";
Это создает str как массив из 5 символов и копирует символы 'S', 'h', 'i', 'v' и '\ 0' в str [0], str [ 1], ..., стр. [4]. Значения в каждом элементе str
могут быть изменены.
Когда я хочу использовать указатель на строковый литерал, я обычно объявляю его const
. Таким образом, компилятор может помочь мне, выдав сообщение, когда мой код хочет изменить содержимое строкового литерала
const char *str = "Shiv";
Представьте, что вы можете сделать то же самое с целыми числами.
/* Just having fun, this is not C! */
int *ptr = &5; /* address of 5 */
*ptr = 42; /* change 5 to 42 */
printf("5 + 1 is %d\n", *(&5) + 1); /* 6? or 43? :) */
Цитата из стандарта:
6.4.5 Строковые литералы
...
6 ... Если программа пытается изменить такой массив [строковый литерал], поведение не определено.