2017-08-05 4 views
-4

Pourquoi est-ce que je peux changer l'élément au pointeur p, mais pas au pointeur r? Je devine que cela doit faire avec les propriétés des pointeurs.Le pointeur sur la chaîne ne réussit pas à changer de caractère

La modification de p[2] à w rend Gowdbye. Changer r bloque le code.

L'adresse de p est 0x69fee0.

L'adresse de r est 0x69fedc.

Les deux ont les mêmes sorties à la boucle for (à part les données de rebut après la fin du mot 'Goodbye').

int main() 
{ 
    char q[]="Goodbye"; 
    char* p = q; 
    char* r = "Goodbye"; 

    cout<<"Address of p: "<<&p<<endl; 
    cout<<"Address of r: "<<&r<<endl; 
    for(int i = 0; i<10; i++) 
    { 
     cout<<"P["<<i<<"]: "<<p[i]<<endl; 
     cout<<"R["<<i<<"]: "<<r[i]<<endl; 
    } 
    p[2]='w'; 
    cout<<p<<endl; 
    r[2]='w'; 
    cout<<r<<endl; 
    return 0; 
} 

Répondre

8

La différence est que q est un (mutable) matrice qui est initialisé avec une « copie » de chaîne littérale "Goodbye", alors que r est un pointeur vers le (immuable) chaîne elle-même littéral. Changer les littéraux de chaîne est un comportement indéfini (et pourrait donc planter ou faire autre chose).

0

Raison de ce défaut est la différence entre * et []: -

la différence réelle est que lorsque nous déclarons * r = « Au revoir » compilateur placera le revoir dans une lecture seule des parties de la mémoire et renvoyer un pointeur à cet endroit qui sera placé dans le pointeur de carbonisation et de toute opération d'écriture va être à l'origine Segmentation fault

mais q [] va allouer l'emplacement de mémoire pour les caractères puis copier les caractères à cet endroit et emplacement est writeab le donc toute modification est valide.

+0

Il n'y a aucune garantie que le littéral de chaîne sera placé dans la "mémoire morte". Le standard C++ dit simplement que tenter de modifier un littéral de chaîne conduit à un comportement indéfini. –