D'autres réponses disent la vue du point de vue des normes, mais voici pourquoi il se bloque.
Les compilateurs placent généralement les littéraux de programme - en particulier les chaînes - dans la mémoire morte. La mémoire est marquée en lecture seule par le système d'exploitation, de sorte que toute tentative d'écriture sera piégée et, sur votre plate-forme, c'est ce que l'erreur de segmentation indique; une tentative d'effectuer une opération sur une mémoire non autorisée. L'autre type de crash associé à une mauvaise utilisation de la mémoire est une erreur de bus, qui indique généralement un accès mémoire non aligné ou une écriture sur une page qui n'est pas mappée du tout. Pour le code C, la différence est presque entièrement académique (d'autres implémentations de langage utilisent ces fautes pour les aider à gérer la mémoire).
Notez que le piégeage des écritures en lecture seule est indépendant de la sémantique officielle de la langue. Bien que vous ayez un char*
pointant dessus, vous ne pouvez toujours pas l'écrire. Traitez toujours les littéraux de programme comme s'ils pointent vers une mémoire constante et vous ne vous tromperez pas (ils ne le sont pas par défaut en raison de la nécessité de prendre en charge la compatibilité avec les anciens programmes).
Quelle plateforme? Travaille pour moi... –