2012-05-21 3 views
4

J'ai besoin d'un tableau de chaînes. La longueur d'une chaîne est connue au moment de la compilation et il est crucial que chaque chaîne occupe autant d'espace. D'autre part, le nombre de chaînes n'est connu qu'à l'exécution. Quelle est la syntaxe pour cela?Déclaration d'un tableau de longueur fixe de chaînes de longueur fixe

char* data[STRLENGTH] est une syntaxe incorrecte. char** data fonctionne principalement mais sizeof(data[0]) est faux - il doit être égal à STRLENGTH.

Répondre

9

est correcte @ Daniel, mais ce code peut dérouter les gens qui l'ont lu - ce n'est pas quelque chose que vous faites habituellement. Pour le rendre plus compréhensible, je vous suggère de le faire en deux étapes:

typedef char fixed_string[STRLENGTH]; 
fixed_string *data; 
+0

Ce n'est pas * ça * déroutant; Les pointeurs vers les tableaux ne sont pas beaucoup plus compliqués que les pointeurs vers d'autres types. C'est juste que la précédence de '[]' sur '*' nécessite un groupement explicite. –

+0

Mon premier instinct quand je vois quelque chose comme char (* data) est de trouver le pointeur de fonction. De toute façon, il n'y a pratiquement aucun inconvénient à définir un type intermédiaire (vous le passerez par référence et non par valeur sans l'attendre, mais ce n'est pas toujours un problème) – zmbq

5
char* data[STRLENGTH] 

déclare un tableau de pointeurs vers STRLENTGHchar. Pour déclarer un pointeur sur un tableau de STRLENGTHchar s, utilisez

char (*data)[STRLENGTH] 
+0

Même si une chose à garder à l'esprit est que si Erik passe cela à travers les limites de la fonction, il ne devrait pas utiliser sizeof pour obtenir la taille de la chaîne à cause de la chute du pointeur. – birryree

+1

'data' est un pointeur, donc il n'y a pas de problème de désintégration. 'data [i]', OTOH, est une expression de tableau, et que * serait * décroître en un pointeur s'il est passé à une fonction. –

4
char (*data)[LEN];     // where LEN is known at compile time 
... 
data = malloc(sizeof *data * rows); // where rows is determined at run time 
... 
strcpy(data[i], some_name); 
... 
printf("name = %s\n", data[i]); 
... 
free(data); 

Notez que data est un type de pointeur, pas un type de tableau (data est un pointeur vers un LEN tableau -Element de char). L'appel malloc allouera dynamiquement assez de mémoire pour contenir rows tableaux de longueur LEN. Chaque data[i] sera de type char [LEN].

Questions connexes