Bonjour à tous,
J'apprends le C et je me demandais quelques questions sur la déclaration des chaînes de caractères. Je me demandais quelles étaient les différences principales entre ces deux déclarations :
1) char *chaine1= "hello!";2) char chaine2[] = "hello!";De ce que j'ai compris, la déclaration 1) stocke un pointeur vers une chaîne de caractères donc la chaîne de caractères elle-même n'est pas "située" dans la variable mais à une certaine adresse. En revanche, la déclaration 2) stocke la chaîne de caractère avec la mémoire minimale nécessaire.
J'aurais donc plusieurs questions :
- si je fais un printf("%p", chaine1); j'obtiens une adresse (normal c'est un pointeur), ce qui est cohérent car si je fais un sizeof(chaine1), j'obtiens 4 octets. Par contre, si je fais un printf("%s", chaine1) j'obtiens une chaîne de caractères... donc chaine1 est un pointeur ou une chaîne de caractères ? Pour moi c'est soit une adresse, soit un tableau de caractères, mais pas les deux !
- même question pour chaine2, j'obtiens également une adresse mais pourtant chaine2 est une variable qui prend la place nécessaire pour stocker "hello!" et non celle d'un pointeur.
- si je modifie chaine1 par une commande de type strcpy, le programme plante, j'imagine que cela vient du fait que je souhaite modifier une adresse et non une chaîne de caractères, mais je ne comprends pas bien.
- si je modifie chaine2 par une chaîne plus grande, que se passe-t-il au niveau mémoire ? Est-ce que la commande strcpy s'assure qu'il y a de la place et change l'adresse le cas échéant ? ou n'y a-t-il aucune sécurité et dans ce cas on peut écraser des données mises en mémoire ?
Merci de vos réponse,
Andrew
Partager