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()
для них.