Il existe plusieurs façons de créer un tableau de chaînes en C. Si toutes les chaînes doivent être de la même longueur (ou du moins avoir la même longueur maximale), il suffit de déclarer un tableau 2-d de chars et de les assigner si nécessaire :
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
Vous pouvez également ajouter une liste d'initialisateurs :
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
Cela suppose que la taille et le nombre de chaînes de l'initialisateur correspondent aux dimensions de votre tableau. Dans ce cas, le contenu de chaque chaîne littérale (qui est elle-même un tableau de caractères à terminaison zéro) est copié dans la mémoire allouée à strs. Le problème avec cette approche est la possibilité de fragmentation interne ; si vous avez 99 chaînes de 5 caractères ou moins, mais 1 chaîne de 20 caractères, 99 chaînes auront au moins 15 caractères inutilisés ; c'est un gaspillage d'espace.
Au lieu d'utiliser un tableau à 2 dimensions de chars, vous pouvez stocker un tableau à 1 dimension de pointeurs vers chars :
char *strs[NUMBER_OF_STRINGS];
Notez que dans ce cas, vous n'avez alloué de la mémoire que pour contenir les pointeurs vers les chaînes de caractères ; la mémoire pour les chaînes de caractères elles-mêmes doit être allouée ailleurs (soit sous forme de tableaux statiques, soit en utilisant malloc() ou calloc()). Vous pouvez utiliser la liste d'initialisation comme dans l'exemple précédent :
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
Au lieu de copier le contenu des constantes de chaîne, vous stockez simplement les pointeurs vers celles-ci. Notez que les constantes de chaîne peuvent ne pas être accessibles en écriture ; vous pouvez réaffecter le pointeur, comme suit :
strs[i] = "bar";
strs[i] = "foo";
Mais il se peut que vous ne puissiez pas modifier le contenu de la chaîne de caractères, par exemple,
strs[i] = "bar";
strcpy(strs[i], "foo");
peut ne pas être autorisé.
Vous pouvez utiliser malloc() pour allouer dynamiquement le tampon pour chaque chaîne et copier dans ce tampon :
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
BTW,
char (*a[2])[14];
Déclare que a est un tableau à 2 éléments de pointeurs vers des tableaux de chars à 14 éléments.