Méthode correcte pour initialiser un tableau de chaînes terminé par NULL en C

Ce code est-il correct?

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

C’est correct du sharepoint vue syntaxique, et cela crée un tableau de chaînes terminé par NULL.

argv est passé à main sous la forme char*[] (ou de manière équivalente, char** ), mais il est “plus correct” de traiter les littéraux de chaîne comme des caractères const char* plutôt que char* . Donc, avec cet exemple particulier, vous voudriez const char *argv[] = {"foo", "bar", NULL };

Peut-être que vous n’allez pas vraiment l’initialiser avec “foo”, mais en fait avec une chaîne modifiable que vous voudrez modifier via argv. Dans ce cas, char*[] raison. C’est le genre de chose que Charles veut probablement dire en disant que le code est “correct”, cela dépend de ce que vous en faites.

Il n’y a rien de mal à éviter la déclaration ou l’initialisation, mais son exactitude dépend de ce que le rest du code fait réellement avec argv .

Oui, votre code est formellement correct (voir cependant la remarque de Steve à propos de const ). Il produira un tableau qui se termine par un pointeur null de type char * .

Vous pouvez aussi faire

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

ou

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

si votre tableau pour une raison quelconque doit avoir une taille spécifique. Dans ce cas, les éléments supplémentaires seront également définis sur des pointeurs nuls, même si vous ne les initialisez pas explicitement. Mais je dirais que même dans ce cas, il vaut mieux utiliser

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

car cela garantira que le tableau est en effet suffisamment long pour obtenir une terminaison nulle (si le tableau est trop court, le compilateur générera un message de diagnostic).