char* ptr = "hello"; ptr = "world"; // maybe 2 minutes later, i change again ptr = "something else";
3 Réponses :
Si vous n'utilisez que des pointeurs directement, le système d'exploitation attribuera de la mémoire pour "bonjour" et "monde" à des endroits séparés et vous changerez essentiellement votre pointeur vers ces différentes adresses.
Donc, dans le cas 2, il y aura 3 emplacements différents pour "bonjour", "monde" et "autre chose" et le pointeur sera simplement réaffecté au troisième emplacement lorsque vous faites ptr = "autre chose"
Voir également: Pourquoi une chaîne peut-elle être affectée à un pointeur char *, mais pas à un tableau char []?
Ce n'est pas le système d'exploitation qui fait cela.
@PaulOgilvie Qui d'autre exécute le programme?
@sleeping_dragon L'implémentation C attribue les adresses, le système d'exploitation charge simplement le programme en mémoire.
Le pointeur changera. Le texte "bonjour" reste en mémoire , mais il n'est plus accessible de manière valide.
The address of ptr is 0000000000404000 The address of ptr is 0000000000404020
Le texte «bonjour» reste donc dans la mémoire de l'ordinateur même si nous fermons le logiciel de programmation. Il est juste là, ne disparaît jamais automatiquement, non?
@ChenerZhang non, il disparaîtra lorsque votre programme se terminera proprement.
Notez que ce que vous imprimez comme "l'adresse de ptr" n'est pas l'adresse de ptr - c'est l'adresse dans ptr (la valeur de ptr). Choix de mots déroutant.
Réaffecter le pointeur de & "hello" [0]
à & "world" [0]
changera clairement sa valeur. (le & [0]
rend simplement explicite le tableau autrement implicite).
Les littéraux de chaîne sont enregistrés dans la mémoire statique en lecture seule (= ils ont la durée de vie du programme), et "hello"
et "world"
ne peuvent certainement pas occuper la même chose place compte tenu de leurs différents contenus.
Changer le pointeur de "hello"
à "hello \ 0world"
pourrait laisser la valeur du pointeur inchangée car le compilateur pourrait fusionner les deux littéraux de chaîne en un seul ( 6.4.5p7 a >).
Mais aucun de mes compilateurs installés (tcc, gcc, clang) ne le fait.
Pour
0x55c30f718004 0x55c30f718014 0x55c30f71800e
J'obtiens différentes valeurs de pointeur, par exemple:
#include <stdio.h> int main() { char *p; p = "hello"; printf("%p\n", p); p = "hello\0world"; printf("%p\n", p); p = "world"; printf("%p\n", p); }
En relation: stackoverflow.com/questions/2589949/ …
Vous pouvez également simplement imprimer l'adresse avec% p et voir, peut-être. Je ne sais pas à 100% ce que vous demandez
"hello"
est une chaîne littérale stockée dans l'exécutable. Il ne disparaîtra pas, mais vous ne pourrez plus y accéder, à moins que vous ne recommenciez ailleursptr = "bonjour";