2010-08-15 6 views
4

Voici les deux façons d'initialiser un tableau de caractères:Initialisation d'un tableau de caractères dans C. Quelle est la meilleure solution?

char charArray1[] = "foo"; 
char charArray2[] = {'f','o','o','\0'}; 

Si les deux sont équivalents, on pourrait penser tout le monde à utiliser la première option ci-dessus (car il nécessite moins de coups clés). Mais j'ai vu le code où l'auteur prend la peine de toujours utiliser la deuxième méthode. Je suppose que dans le premier cas, la chaîne "foo" est stockée dans le segment de données et copiée dans le tableau à l'exécution, alors que dans le second cas les caractères sont stockés dans le segment de code et copiés dans le tableau à runtime. Et pour une raison quelconque, l'auteur est allergique à avoir quelque chose dans le segment de données.

Éditer: Supposons que les tableaux sont déclarés locaux à une fonction.

Questions: Mon raisonnement est-il correct? Quel est votre style préféré et pourquoi?

+0

le premier style - certainement. plus clair et plus concis. les impacts de perf entre 1 et 2 seraient négligeables par rapport aux avantages de lisibilité. – obelix

+3

Connexes: http://stackoverflow.com/questions/3427750/difference-between-array-initializations et http://stackoverflow.com/questions/3429071/string-initializer-and-read-only-section –

+0

@Prasoon Merci pour les liens. J'ai googlé et cherché SO avant de poster mais je ne l'ai pas trouvé. –

Répondre

5

Qu'en est-il une autre possibilité:

char charArray3[] = {102, 111, 111, 0}; 

Vous ne devriez pas Oubliez le type de caractère C est un type numérique, il arrive juste que la valeur est souvent utilisée comme un code char. Mais si j'utilise un tableau pour quelque chose qui n'est pas du tout lié au texte, je préférerais certainement l'initialiser avec la syntaxe ci-dessus plutôt que de l'encoder en lettres et de les mettre entre guillemets.

Si vous ne voulez pas le terminal 0 vous devez aussi utiliser la deuxième forme ou en cours d'utilisation C:

char charArray3[3] = "foo"; 

Il est aa fonction C que presque personne ne le sait, mais si le compilateur ne pas assez de place pour contenir le 0 final lors de l'initialisation d'un charArray, il ne le met pas, mais le code est légal. Cependant, ceci devrait être évité car cette fonctionnalité a été supprimée de C++, et un compilateur C++ produirait une erreur.

J'ai vérifié le code d'assemblage généré par gcc, et toutes les différentes formes sont équivalentes. La seule différence est qu'il utilise soit .string ou pseudo instruction .byte pour déclarer des données. Mais c'est juste un problème de lisibilité et cela ne fait pas une petite différence dans le programme qui en résulte.

1

Je pense que la deuxième méthode est principalement utilisée dans le code hérité où les compilateurs ne supportaient pas la première méthode. Les deux méthodes doivent stocker les données dans les segments de données. Je préfère la première méthode en raison de la lisibilité. De plus, j'avais besoin de patcher un programme une fois (je ne me rappelle plus lequel, c'était un outil UNIX standard) pour ne pas utiliser/etc (c'était pour un système embarqué). J'ai eu beaucoup de mal à trouver le bon endroit, car ils ont utilisé la deuxième méthode et mon grep ne pouvait pas trouver « etc » partout :-)

+1

quels compilateurs "ne supportaient pas la première méthode"? C'est strictement C89, chaque compilateur ANSI devrait supporter cela. – user411313

+0

c'est bien si vous tenez votre tableau char pour contenir du texte, si vous voulez stocker des nombres '" \ x66 \ x6f \ x6f "' est nettement moins lisible que '{102, 111, 111, 0}' (vous avez même pour aller avec la conversion hexa ou décimale parce que vous ne pouvez pas taper un code char en utilisant la décimale). Perdre la deuxième forme serait une vraie douleur dans certains cas. – kriss

+0

@gordongekko: Je supposais que K & R C avait des problèmes avec la bonne méthode, mais certains googling semble suggérer que même K & R C supportait les deux méthodes ... – DarkDust