Для полноты проекта C99 проект стандарта ( C89 и C11 имеет схожую формулировку ) в разделе 6.4.5
. Строковые литералы, параграф 5 , гласят:
[...] байт или код нулевого значения добавляется к каждой многобайтовой последовательности символов, которая возникает из строкового литерала или литералов. Последовательность многобайтовых символов затем используется для инициализации массива статической продолжительности хранения и длины, достаточной для того, чтобы содержать последовательность. Для символьных строковых литералов элементы массива имеют тип char и инициализируются отдельными байтами многобайтовой последовательности символов, [...]
blockquote>Таким образом, это говорит строковый литерал имеет статическую продолжительность хранения ( длится время жизни программы ), и это тип
char[]
(неchar *
), а его длина - это размер строкового литерала с добавленным нулем , * Параграф 6 говорит:Если программа пытается изменить такой массив, поведение не определено.
blockquote>Поэтому попытка изменить Строковый литерал является неопределенным поведением , независимо от того, что они не являются
const
.В отношении
argv
в разделе5.1.2.2.1
Программа в пункте 2 запуска говорится:Если они объявлены, параметры главной функции должны подчиняться следующим ограничениям:
[...]
. Параметры argc и argv и строки, на которые указывает массив argv, могут быть модифицированы программой и сохраняют свои последние сохраненные значения между запуском программы и завершением программы.
blockquote>Таким образом,
argv
не считается массивом строковых литералов, и нормально модифицировать содержимоеargv
.