ISO C требует, чтобы размещенные реализации вызывали функцию с именем main. Если программа получает аргументы, они принимаются как массив указателей char*, второй аргумент в main определении int main(int argc, char* argv[]).
ISO C также требует, чтобы строки, на которые указывает массив argv были модифицируемыми.
Но могут ли элементы argv псевдонима друг друга? Другими словами, могут ли быть i, j такие, что
-
0 >= я && я < argc -
0 >= j && j < argc -
i != j -
0 < strlen(argv[i]) -
strlen(argv[i]) <= strlen(argv[j]) -
argv[i]aliasesargv[j]
при запуске программы? Если это так, запись через argv[i][0] также будет видна через строку aliasing argv[j].
Соответствующие положения стандарта ISO C ниже, но не позволяют мне окончательно ответить на титульный вопрос.
§ 5.1.2.2.1 Запуск программы
Функция, вызванная при запуске программы, называется
main. Реализация не объявляет прототипа для этой функции. Он должен быть определен с типом возвратаintи без параметров:int main(void) { /* ... */ }или с двумя параметрами (называемыми здесь
argcиargv, хотя любые имена могут использоваться, поскольку они являются локальными для функции, в которой они объявлены):int main(int argc, char *argv[]) { /* ... */ }или эквивалент; 10) или каким-либо другим способом реализации.
Если они объявлены, параметры
mainфункции должны подчиняться следующим ограничениям:
- Величина
argcдолжна быть неотрицательной.argv[argc]должен быть нулевым указателем.- Если значение
argcбольше нуля, члены массиваargv[0]черезargv[argc-1]включительно должны содержать указатели на строки, которым перед запуском программы заданы значения, определяемые реализацией среды хоста. Цель состоит в том, чтобы предоставить информацию о программе, определенную до запуска программы, из другого места в размещенной среде. Если среда хоста не способна снабжать строки буквами в верхнем и нижнем регистре, реализация должна гарантировать, что строки получены в нижнем регистре.- Если значение
argcбольше нуля, строка, на которую указываетargv[0]представляет собой имя программы;argv[0][0]должен быть нулевым символом, если имя программы недоступно в среде хоста. Если значениеargcбольше единицы, строки, на которые указываетargv[1]черезargv[argc-1]представляют собой параметры программы.- Параметры
argcиargvи строки, на которые указывает массивargv, могут быть модифицированы программой и сохраняют свои последние сохраненные значения между запуском программы и завершением программы.
По моему чтению ответ на титульный вопрос "да", поскольку нигде он не запрещен явно, и нигде стандартное требование или требование использования char* restrict* -qualified argv, но ответ может включить интерпретацию "и сохранить их последние сохраненные значения между запуском программы и завершением программы.".
Практический импорт этого вопроса заключается в том, что если ответ на него действительно "да", переносная программа, которая хочет изменить строки в argv сначала должна выполнить (эквивалент) POSIX strdup() для них.