Confusion sur les pointeurs de personnage en C

Les pointeurs de caractère en C me déroutent.

Supposons que nous ayons un pointeur de caractère, qui pointe sur le premier caractère de la constante chaîne.

char *a="ABCD"; 

Ensuite, nous ne pouvons pas modifier la valeur de ce caractère à l’aide du pointeur a, car l’instruction suivante entraîne une erreur de segmentation.

 *a='X'; 

Supposons maintenant que nous ayons un pointeur de caractère qui pointe vers une constante de caractère.

 const char B='X'; char *ptr=&B; 

Ensuite, nous sums autorisés à changer la valeur de ce caractère en utilisant l’instruction

 *ptr='Z'; 

Ma question est la suivante: s’agit-il d’un comportement indéfini prouvant que C n’est pas robuste? Ou y a-t-il une logique plus profonde impliquée?

La raison pour laquelle le pointeur se comporte différemment est que le programme C a plusieurs segments de mémoire, dont certains sont protégés.

Ensuite, nous ne pouvons pas modifier la valeur de ce caractère à l’aide du pointeur a, car l’instruction suivante entraîne une erreur de segmentation.

Contrairement aux autres constantes, les constantes de chaîne sont placées dans un segment protégé. Toute tentative de modification de ce segment entraîne un comportement indéfini (par exemple, votre programme peut commettre une erreur de segmentation).

Puisque votre pointeur pointe dans une constante de chaîne, la valeur sur laquelle elle pointe ne peut pas être modifiée. Si vous forcez une copie de la constante dans la mémoire modifiable à l’aide d’un tableau, la même modification sera autorisée:

 char a[]="ABCD"; *a='X'; 

Ensuite, nous sums autorisés à modifier la valeur de ce caractère [unique] à l’aide de l’instruction

En effet, la constante de caractère est toujours copiée dans la mémoire modifiable.

Disons que C vous permet de vous tirer une balle dans le pied assez facilement. Modifier B rest un comportement indéfini, tout comme modifier *a était, car B a été déclaré const .

Pour vous aider, activer les avertissements (ce que vous devez toujours faire sauf dans des circonstances très spécifiques) ouvre les éléments suivants sur GCC:

 warning: initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers] 

En C, la modification du littéral de chaîne n’est pas autorisée.

 char *a="ABCD"; 

est équivalent à

 char const *a="ABCD"; 

*a='X'; modifie le littéral de chaîne ABCD . Alors que dans le second cas, ptr pointe vers un caractère qui ne doit pas être changé et *ptr='Z'; modifiera le contenu de l’emplacement qui contient X qui n’est pas valide non plus.

Notez que la modification d’un object qualifié de const est une violation de contrainte.