Вопрос: Зачем нам нужен argc, хотя в конце argv всегда есть нуль?


Кажется, что argv[argc] всегда NULL, поэтому я думаю, что мы можем пересечь список аргументов без argc, Один while цикл сделает это.

Если всегда есть NULL в конце argv, зачем нам argc?


110


источник


Ответы:


Да, argv[argc]==NULL гарантируется. Видеть C11 5.1.2.2.1 Запуск программы  (мой акцент)

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

Величина argc должна быть неотрицательной.    argv [argc] должен быть нулевым   указатель.

обеспечение argc поэтому не является жизненно важным, но по-прежнему полезна. Помимо всего прочего, это позволяет быстро проверить правильность количества аргументов.

Изменить: вопрос был изменен, чтобы включить C ++. n3337 черновик 3.6.1 Основная функция  говорит

2 ... argc - количество аргументов, переданных программе из   среда, в которой выполняется программа. .... Значение argc   должны быть неотрицательными. Значение argv [argc] должно быть 0 ,


98



Да, argv[argc] гарантированно будет нулевым указателем. argc используется для удобства.

Цитируя официальное объяснение из C99 Обоснование, обратите внимание на слова избыточная проверка :

Обоснование международного стандарта - Языки программирования - C  §5.1.2.2.1 Запуск программы

Спецификация argc а также argv в качестве аргументов main признает обширную практику. argv[argc] должен быть нулевым указателем для предоставления избыточной проверки для конца списка, также на основе обычной практики.


42



Это по историческим причинам и совместимость со старым кодом. Первоначально не было гарантии, что в качестве последнего элемента массива argv будет существовать нулевой указатель. Но у argc есть всегда  существовала.


18



Мы «нуждаемся» в этом, потому что это требуется по различным стандартам.

Мы можем полностью игнорировать значение, но поскольку это первый параметр main, мы должны иметь его в списке параметров. В C ++ (и, возможно, нестандартных диалектах C) вы можете просто опустить имя параметра, как этот фрагмент C ++ (легко преобразовать в C):

#include <stdio.h> // C-compatible include, guarantees puts in global namespace

// program will print contents of argv, one item per line, starting from argv[0]

int main(int /*argc*/, char *argv[]) { // uncomment argc for C

    //(void)argc; // uncomment statement for C

    for (int i=0; argv[i]; ++i) {
        puts(argv[i]);
    }

    return 0;
}

В стандарте C, с общими настройками предупреждений, неиспользуемый параметр генерирует предупреждение, которое может быть исправлено с помощью инструкции типа (void)argc; который заставляет использовать имя без генерации какого-либо кода.

argc это хорошо, потому что в противном случае многие программы должны были бы отслеживать параметры, чтобы получить счет. Кроме того, во многих языках программирования с массивами, которые имеют длину, нет argc параметр, есть только массив с элементами.


6