¿Este código es correcto?Forma correcta de inicializar una matriz de cadenas terminados en NULL en C
char *argv[] = { "foo", "bar", NULL };
¿Este código es correcto?Forma correcta de inicializar una matriz de cadenas terminados en NULL en C
char *argv[] = { "foo", "bar", NULL };
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.
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
.
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).
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. –
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