¿Por qué necesitamos argc mientras siempre hay un null al final de argv?


Parece que el argv[argc] es siempre NULL, así que creo que podemos recorrer la lista de argumentos sin argc. Un único bucle while hará esto.

Si siempre hay un NULL al final de argv, ¿por qué necesitamos una argc?

 112
Author: Cole Johnson, 2013-08-31

4 answers

Sí, argv[argc]==NULL está garantizado. Ver C11 5.1.2.2.1 Inicio del programa (mi énfasis)

Si se declaran, los parámetros de la función principal obedecerán las siguientes limitaciones:

El valor de argc no será negativo. argv [argc] será nulo puntero.

Proporcionar argc por lo tanto no es vital, pero sigue siendo útil. Entre otras cosas, permite comprobar rápidamente que el número correcto de argumentos ha sido pasar.

Editar: La pregunta ha sido modificada para incluir C++. n3337 draft 3.6.1 Función principal dice

2 ...argc será el número de argumentos pasados al programa desde el entorno en el que se ejecuta el programa. .... El valor de argc no será negativo. El valor de argv[argc] será 0.

 101
Author: simonc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-01 08:45:46

Sí, se garantiza que argv[argc] es un puntero nulo. argc se utiliza por conveniencia.

Citando la explicación oficial de la Justificación de C99, observe las palabras verificación redundante :

Rationale for International Standard-Programming Languages-C §5.1.2.2.1 Inicio del programa

La especificación de argc y argv como argumentos para main reconoce una amplia práctica anterior. argv[argc] debe ser un puntero nulo para proporcionar una comprobación redundante para el final de la lista, también sobre la base de la práctica común.

 43
Author: Yu Hao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-03 07:26:50

Es por razones históricas y compatibilidad con código antiguo. Originalmente, no había una garantía de que existiría un puntero nulo como el último elemento de la matriz argv. Pero argc ha siempre existido.

 18
Author: zentrunix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-31 12:55:12

Lo "necesitamos", porque es requerido por varios estándares.

Somos libres de ignorar el valor por completo, pero como es el primer parámetro de main, debemos tenerlo en la lista de parámetros. En C++ (y probablemente dialectos C no estándar), puede omitir el nombre del parámetro, como este fragmento de C++ (fácil de convertir a 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;
}

En el estándar C, con configuraciones comunes de advertencias, el parámetro no utilizado genera una advertencia, que se puede corregir mediante una instrucción como (void)argc; que hace que el nombre ser utilizado sin generar ningún código.

argc es bueno tener, porque de lo contrario muchos programas tendrían que caminar thorugh los parámetros para obtener la cuenta. Además, en muchos lenguajes de programación con matrices que tienen longitud, no hay ningún parámetro argc, solo hay una matriz con los elementos.

 6
Author: hyde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-04 05:42:43