Différence entre char * str = “…” et char str = “…”?

Dupliquer possible:
Quelle est la difference entre char s [] et char * s en C?
Question sur les pointeurs et les chaînes en C

Je lis sur les chaînes en C et je suis confus. Je peux “déclarer” des chaînes de deux manières:

char *str = "This is ssortingng"; char str2[20] = "This is ssortingng"; 

Quelle est la différence entre les deux déclarations? Quand préféreriez-vous que char str2[20] soit préféré à char *str ?

 char *str = "This is ssortingng"; 

Place la chaîne dans la constant data section (also known as .rdata) du programme. constant data section (also known as .rdata) données ne peuvent pas être modifiées.

 char str2[20] = "This is ssortingng"; 

Dans ce type de déclaration, les données sont de préférence stored in the stack area de stored in the stack area du programme, si elles sont déclarées dans l’ function scope la function scope et dans data section si elles sont déclarées dans global scope . Ces données peuvent être modifiées.

Donc, si vous devez modifier les données, utilisez la deuxième approche.

En C, les chaînes sont représentées sous forme de séquences de caractères, avec un caractère NULL (ou 0, '\0' ). Ils sont stockés dans la mémoire et vous utilisez un moyen de le référencer. Vous avez identifié les deux manières de le référencer, un caractère char * , qui est un pointeur sur une séquence de chars et un tableau, qui est une chaîne immédiate de caractères en tant que variable réelle. Sachez que la chaîne “abc” a une longueur de 4 octets car il existe un caractère NULL supplémentaire pour représenter la fin de la chaîne.

En plus de cela, vous assignez en réalité des chaînes dans l’exemple, ce qui implique également les chaînes à donner au moment de la compilation.

Donc deux questions. Le premier concerne la façon dont vous représentez les chaînes ( char * vs char[] ), le second concerne les chaînes au moment de la compilation.

Pour venir à vos exemples:

Le premier crée une chaîne constante dans le texte du programme et un pointeur sur celui-ci. Selon le compilateur, il peut être stocké n’importe où. C’est l’équivalent de mallocing une chaîne et d’y stocker un pointeur, sauf que vous ne devez pas modifier le contenu de la mémoire. C’est un caractère char * , vous pouvez donc changer le pointeur pour qu’il pointe vers un autre endroit, comme une autre chaîne malloced ou le début d’un tableau que vous avez défini dans l’exemple 2.

La seconde crée un tableau de caractères (qui représente une manière de représenter une chaîne). Le tableau est stocké et alloué sur la stack pour la durée de la fonction et vous pouvez en modifier le contenu. Parce que ce n’est pas un pointeur, vous ne pouvez pas le changer pour qu’il pointe vers une autre chaîne.

C n’a pas de cordes. Tout ce qu’il y a, c’est des tableaux de caractères. Et les tableaux en C ne sont que des pointeurs sur le premier élément.

Le moyen le plus simple de le faire est en fait votre première variante. Ne pas spécifier une longueur explicite du tableau pour les littéraux vous évitera de faire quelque chose comme

 char[3] = "abc"; 

Les chaînes C sont constantes en mémoire, donc:

 char *str = "This is ssortingng"; 

Stocke “Ceci est une chaîne” en mémoire et ne peut pas être modifié, vous ne pouvez affecter une autre adresse à str.

toutefois

 char str2[20] = "This si ssortingng"; 

est un raccourci de

 char Ssortingng2[20]={'T','h','i','s',' ','s','i',' ','s','t','r','i','n','g','\0'}; 

qui ne stocke pas de chaîne en mémoire, stocke des octets indépendants.

Si vous souhaitez utiliser des chaînes constantes telles que des messages, utilisez la première ligne. Si vous voulez utiliser et manipuler des chaînes comme dans un traitement de texte, utilisez ensuite.

Cordialement

char *str = "This is ssortingng"; – Ceci maintiendra la chaîne dans le segment de texte en tant que données en lecture seule et stockera l’adresse dans la variable de pointeur local str .

 str[0] = 'a'; //This will leads to crash, because ssortingngs are in read only segment. printf("%d",sizeof(str)); //This will print 4(in 32bit m/c) or 8(in 64 bit m/c) 

char str2[20] = "This is ssortingng"; – Ceci gardera la chaîne en tant que tableau de caractères dans la stack locale.

 str2[0] = 'a'; //This will change the first character to a printf("%d",sizeof(str2)); //This will print 20