1
votes

L'adresse pointée par le pointeur changera-t-elle si nous changeons char * ptr =;

char* ptr = "hello";
ptr = "world";
// maybe 2 minutes later, i change again
ptr = "something else";

3 commentaires

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 ailleurs ptr = "bonjour";


3 Réponses :


0
votes

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 []?


3 commentaires

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.



2
votes

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


3 commentaires

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.



0
votes

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);
}


0 commentaires