2010-09-16 29 views
9

¿Existe un límite en el número de argumentos que pasamos a main() en C? Como todos saben, se define como int main(int argc, char *argv[]).Límite en el número de argumentos a main en C

Cuando llamo el programa, puedo pasar argumentos de este modo:

$ prog.exe arg1 arg2 arg3.....argn 

¿Existe un límite superior en el número de argumento de que podemos suministrar a main() de esta manera?

+0

Consulte también [Para verificar la condición E2BIG en 'exec()'] (http://stackoverflow.com/questions/18559403/to -check-the-e2big-error-condition-in-exec). –

Respuesta

13

No, no hay límite impuesto por la norma ISO C99. Si está utilizando el "bendito" main forma (de los cuales hay dos):

int main (int argc, char *argv[]); 

entonces estará limitado al tamaño máximo de un entero con signo (dependiente de la implementación, pero garantizado para ser al menos 2 -1 o 32,767).

Por supuesto, usted podría incluso tener más que eso ya que la norma permite específicamente no benditos main formas (por ejemplo, uno que toma un long como el recuento).

La norma ordena cómo se almacenan los argumentos y cosas como argv[argc] tienen que ser NULL, pero no limita directamente la cantidad.

Por supuesto, habrá un límite en la práctica, pero esto dependerá completamente de la implementación y el entorno. Sin embargo, si tiene que preguntar, probablemente esté haciendo something wrong.

mayoría de las herramientas colocarían una verdadera gran número de argumentos en un archivo de respuestas (por ejemplo args.txt) A continuación, pasar un solo argumento como:

my_prog @args.txt 

que se pone límites arbitrarios en torno a la cantidad y tamaño de argumento.

+0

Por "no bendecido" ¿quiere decir que el estándar permite que las implementaciones 'funcionen' sin un sistema operativo? – pmg

+1

No, no del todo. Aún puede usar una de las dos formas canónicas en un entorno que no sea OS, incluso si no hay argumentos pasados. 'Main' no suele ser el punto de inicio, por lo que el código de inicio podría presionar cero' argc' y NULL 'argv [0] 'antes de llamar a' main'. Quiero decir que ISO permite otras variantes de main, por ejemplo, la variante '{argc, argv, envp}' de UNIX donde también se pasa el entorno. – paxdiablo

+0

+1 para proporcionar algunas respuestas de Windows. @pmg: No, significa que el Estándar permite a los SO/entornos definir otros formatos no portátiles para 'main'. – Potatoswatter

1

No lo creo. Si bien puede no haber un límite teórico, la computadora probablemente no puede manejar 1,5 millones de argumentos. ¿Hay alguna razón en particular por la que necesites saber esto? Yo no recomendaría el uso de argumentos de línea de comandos para que sean distintos de opciones, parámetros de archivo, ect ...

+0

Fue por esta discusión que estaba teniendo con un colega mío. A mi colega le hicieron esta pregunta en una entrevista. Me preguntaba si podría estar limitado por el tamaño de la pila o por el tamaño de un int. Como se mencionó en andrew, pero no estoy seguro de ninguno de esos. – RaviPathak

+0

@Ravi: No van en la pila. Es más probable que esté limitado por el diseño de la memoria del proceso u otra configuración del sistema operativo. En teoría, podría implementar un * nuevo * entorno C que no sea la plataforma nativa ABI con más capacidades. – Potatoswatter

+0

@Potatoswatter: el espacio para argumentos a menudo se asigna en la pila inicial del proceso. Es fácil ponerlos allí porque el sistema operativo tiene que configurar esta área de todos modos, y permite que el tamaño de los argumentos varíe o crezca en futuras versiones del sistema operativo porque no depende del tamaño de los argumentos. – nategoose

14

De acuerdo con la especificación POSIX para exec, hay una macro ARG_MAX definido en <limits.h> que define el número máximo de bytes de los argumentos + variables de entorno.

Pero dado que C no define nada al respecto, no, no existe un límite inherente de plataforma cruzada. Debe consultar el manual de su sistema operativo si no define esa macro.

+0

Re: 'exec()' syscall. Los sistemas operativos simplemente por razones de cordura limitan la cantidad de memoria que tendrían que transferir de la imagen de memoria de proceso anterior a la nueva que se está creando. Como la transferencia ocurre en kernel, tiene que haber un límite para evitar que los procesos de usuario agoten la memoria del núcleo (imagine la [bomba fork/shell] (http://en.wikipedia.org/wiki/Fork_bomb#Example_fork_bombs)). En Windows eso no debería importar, ya que el proceso anterior permanece, pero IIRC lo limitan también a 32K. – Dummy00001

+0

El valor proporcionado por 'limit.h' podría ser menor que el valor real soportado por el sistema operativo y puede ser utilizado como una forma de decir" bueno, sabemos que puede ser al menos así de grande ". Al configurar argumentos para 'exec', esto puede ser suficiente, pero no confiaría en ese valor para el tamaño de los argumentos que un programa podría pasar realmente por el sistema operativo. – nategoose

0

No hay límite explícito en C. Este es un ejemplo de un comportamiento no definido en el idioma sino la implementación. Recuerde que el idioma en sí es diferente de su implementación, bibliotecas posteriores, IDE, etc.

Cuestiones relacionadas