Согласно спецификации C99 (C99: TC3, 6.4.5, §5) строковые литералы имеют значение
[...] используется для инициализации массива статической длительности и длины хранилища просто
достаточно, чтобы содержать последовательность. [...]
, что означает, что они имеют тип char []
, т.е. в принципе возможна модификация. Почему вы не должны этого делать, объясняется в §6:
Не определено, различаются ли эти массивы при условии, что их элементы имеют
соответствующие значения. Если программа пытается изменить такой массив, поведение
не определено.
Различные строковые литералы с одинаковым содержимым могут, но не обязательно, отображаться в одну и ту же ячейку памяти. Поскольку поведение не определено, компиляторы могут свободно размещать их в разделах, предназначенных только для чтения, для того, чтобы избежать ошибок, вместо того, чтобы вводить, возможно, трудно обнаруживаемые источники ошибок.