могу ли я передать argv из main в execv?

Функция execv() ожидает массив строк с завершением NULL, но не принимает количество аргументов. Он использует сигнальное значение (указатель NULL), чтобы определить, когда заканчивается массив.

На странице руководства для execv() указано...

Первый аргумент по соглашению должен указывать на имя файла, связанного с исполняемым файлом. Массив указателей должен заканчиваться указателем NULL.

...так что мой вопрос....

Я хочу передать argv с main() на execv().

Могу ли я быть уверен, что argv, поступающий в main, завершается нулевым указателем? То есть могу ли я быть уверен, что argv[argc] == NULL или мне нужно выделить свой собственный массив char* размером argc+1 и поставить NULL в индекс argc?

Если я могу быть уверен, это где-то задокументировано?

Спасибо, ~ Эрик


person eric.frederich    schedule 16.05.2012    source источник


Ответы (1)


да. Вектор argv всегда NULL завершается.

В проекте стандарта C99 говорится:

Если они объявлены, параметры функции main должны подчиняться следующим ограничениям:

  • Значение argc должно быть неотрицательным.
  • argv[argc] должен быть нулевым указателем.
person unwind    schedule 16.05.2012
comment
Можете ли вы привести источник для этого? - person Ernest Friedman-Hill; 16.05.2012
comment
@ErnestFriedman-Hill Из стандарта, раздел 5.1.2.2.1 (см., например, c0x.coding-guidelines.com/5.1.2.2.1.html) - person Adriano Repetti; 16.05.2012
comment
лол ... Я хотел бы отметить комментарий от @Adriano как правильный ответ, так как я попросил источник. Что должно соответствовать этому руководству?... компилятор?, ОС (в данном случае Linux), оболочка? - person eric.frederich; 16.05.2012
comment
А что, если я вызову программу OP с помощью execve без завершения вектора командной строки с помощью NULL? Придет ли комитет стандартов и заберет меня? - person cdarke; 16.05.2012
comment
@cdarke нет, они более тонкие, и когда-нибудь в будущем они заставят вашу программу зависнуть, когда вы будете в ванной ... - person Adriano Repetti; 16.05.2012
comment
Соответствие @eric.frederich - обязанность компилятора. То, как аргументы передаются исполняемому файлу, может быть разным для каждой ОС — и на самом деле это так. - person Adriano Repetti; 16.05.2012
comment
@ ErnestFriedman-Hill Я добавил цитату из проекта стандарта C99, осмелюсь предположить, что этот язык не изменился (поскольку это не новое требование). - person unwind; 16.04.2014