Зависит немного от ваших характеристик времени выполнения, но в целом делает что-то вроде:
char *s = "a literal string";
s[3] = 'q';
скомпилируется, но не работает во время выполнения. Литеральная строка в этом случае обычно находится в разделе только для чтения исполняемого файла. Следующий пример, однако, будет работать:
char s[] = "a literal string";
s[3] = 'q';
В этом случае литеральная строка является инициализатором для массива (s
) в стеке. Таким образом, ответ на ваш первый вопрос - «да», а ответ на ваш второй вопрос - «возможно».
Существует семантическая разница между этими двумя примерами. Первый создает указатель на буквальную строку, а второй создает массив и инициализирует его содержимым буквенной строки.