Поскольку char *p = "Hello world"
почти наверняка дал вам указатель на постоянную память, а это значит, что попытка изменить его с помощью *(p+1) = 'l'
- это определенно нет-нет (даже если память не только для чтения,поведение по-прежнему не определено).
Соответствующая часть C99, ссылающаяся на строковые литералы, находится в 6.4.5 para 6
:
Не определено, различаются ли эти массивы при условии, что их элементы имеют соответствующийценности.Если программа пытается изменить такой массив, поведение не определено.
Причина, по которой вы все еще получаете ошибку сегментации с чем-то вроде:
char *p = malloc (100); // sizeof(char) is ALWAYS 1
p = "Hello"; // better would be: strcpy (p, "Hello")
*p = 'a';
потому что, даже если вы выделяете память, которую вам разрешено изменять, второй оператор изменяет указатель , чтобы он указывал на строковый литерал (давая вам утечку mmory по мере потеридоступ к выделенной памяти), который вы не можете изменять.
Вам необходимо отличать изменения указателя от изменений, на которые указывает указатель .