Erreur de segmentation de l’atsortingbution char *

J’essayais de comprendre l’erreur de segmentation pour l’affectation car * pendant le programme suivant pour à l’emplacement * p = ‘Z’

void main() { char *p ="abcdefg"; *p = 'Z'; } 

Lorsque Google a cherché, j’ai trouvé de nombreux liens vers des réponses, comme suit: 1. Il s’agit d’un littéral de chaîne dont la valeur ne peut pas être modifiée. 2. Les littéraux de chaîne ne peuvent pas être affectés à * p 3. Prenez un malloc pouvant être modifié … et bientôt…

Mais je craignais que les valeurs des littéraux de chaîne ne puissent pas être modifiées car elles sont constantes, comment se fait-il que nous ne commettions pas d’erreur de segmentation lorsque nous modifions la valeur constante d’un entier. Quelqu’un peut-il m’aider s’il vous plaît mieux comprendre cela?

-Prashanth

C’est un comportement indéfini. Si vous avez une chaîne constante, la norme indique que les littéraux de chaîne ne peuvent pas être modifiés. Donc, qu’il soit accessible en écriture ou non, cela dépend de l’architecture, et cela peut, ou non, segfault.

mise à jour ajoutée du commentaire.

 char *p ="abcdefg";// p is pointing a read only memory. *p = 'Z'; //You want write a read memoty . 

le premier * est variable pour point, cela signifie que p est un point qui pointe vers un caractère, donc int * p est un point qui pointe vers un entier, il est variable pour point. p, et non * p, est un point, sa valeur est l’adresse de la valeur char en mémoire, vous pouvez le tester avec printf (“p =% d”, p); p contient la valeur de * p, ou une variable char. vous pouvez donc dire * = “valeur indiquée par un pointeur …” et & = “adresse de valeur … en mémoire”. donc, au lieu de char * p, temp; temp = ‘A’; * p = temp; (valeur que le pointeur p indique égale à la valeur de la variable temp)

C’est parce que vous utilisez * pour l’atsortingbution. Votre code se lit comme suit: À l’adresse de p qui est du type pointer stocke la valeur Z, qui est du type char .