web-dev-qa-db-fra.com

Comment déclarer des chaînes en C

Duplicate possible:
Char d'allocation de mémoire * et char []

Quelqu'un peut-il m'expliquer quelle est la différence entre ces lignes de code

char *p = "String";
char p2[] = "String";
char p3[7] = "String";

Dans quel cas devrais-je utiliser chacun des éléments ci-dessus?

104
summerc

Ce lien devrait satisfaire votre curiosité.

Fondamentalement (en oubliant votre troisième exemple qui est mauvais), la différence entre 1 et 2 est que 1 alloue de l'espace pour un pointeur sur le tableau.

Mais dans le code, vous pouvez les manipuler comme des pointeurs de la même manière - seule chose, vous ne pouvez pas réaffecter la seconde.

44
fge

Les chaînes en C sont représentées sous forme de tableaux de caractères.

char *p = "String";

Vous déclarez un pointeur qui pointe vers une chaîne stockée quelque part dans votre programme (modifier cette chaîne est un comportement non défini) conformément au langage de programmation C 2 éd.

char p2[] = "String";

Vous déclarez un tableau de caractères initialisé avec la chaîne "String" laissant au compilateur le travail pour compter la taille du tableau.

char p3[5] = "String";

Vous déclarez un tableau de taille 5 et l'initialisez avec "String". Ceci est une erreur car "String" ne rentre pas dans 5 éléments.

char p3[7] = "String"; est la déclaration correcte ('\ 0' est le caractère final dans les chaînes c).

http://c-faq.com/~scs/cclass/notes/sx8.html

39
obo

Vous ne devriez pas utiliser le troisième parce que c'est faux. "String" prend 7 octets, pas 5.

Le premier est un pointeur (peut être réaffecté à une adresse différente), les deux autres sont déclarés en tant que tableaux et ne peuvent pas être réaffectés à des emplacements mémoire différents (mais leur contenu peut changer, utilisez const pour éviter cela).

21
littleadv
char *p = "String";   means pointer to a string type variable.

char p3[5] = "String"; signifie que vous pré-définissez la taille du tableau pour qu'il ne soit pas composé de plus de 5 éléments. Notez que, pour les chaînes, la valeur null "\ 0" est également considérée comme un élément. Par conséquent, cette instruction générera une erreur, car le nombre d'éléments est égal à 7.

char p3[7]= "String";
7
SKM