2010-05-01 6 views

Respuesta

8

Es sintácticamente correcto y crea una matriz de cadenas con terminación NULL.

argv se pasa a main como char*[] (o equivalentemente, char**), pero es "más correcto" para tratar los literales de cadena como const char* en lugar de un char*. Entonces, con este ejemplo en particular, usted querría const char *argv[] = {"foo", "bar", NULL };

Quizás no lo va a inicializar con "foo", pero en realidad con una cadena modificable que deberá modificar a través de argv. En ese caso, char*[] tiene razón. Este es el tipo de cosas que Charles probablemente quiere decir al decir que si el código es "correcto" depende de lo que haga con él.

+0

Sí, un 'char * []' que se trata como un 'const char * []' puede ser necesario por razones de interfaz, pero con una pregunta tan breve es imposible saberlo. –

+0

Gracias, esto resuelve mi pregunta. Recibí algunas advertencias en mi código: advertencia: la inicialización descarta los calificadores del tipo de destino del puntero Se han ido – jjardon

5

No hay nada malo, obviamente, la declaración o la inicialización, pero si es "correcto" depende de lo que el resto del código en realidad hace con argv.

0

Sí, su código es formalmente correcto (consulte la observación de Steve sobre const). Producirá una matriz que finaliza con un puntero nulo del tipo char *.

También se puede hacer

char *argv[4] = { "foo", "bar" }; 

o

char *argv[10] = { "foo", "bar" }; 

si la matriz por alguna razón tiene que tener un tamaño específico. En este caso, los elementos adicionales también se establecerán en punteros nulos, aunque no los esté inicializando explícitamente. Pero yo diría que incluso en este caso, es mejor utilizar

char *argv[4] = { "foo", "bar", NULL }; 

ya que se asegurará de que la matriz es de hecho el tiempo suficiente para obtener terminada en nulo (si la matriz pasa a ser demasiado corto, el el compilador generará un mensaje de diagnóstico).

Cuestiones relacionadas