La plupart de ces réponses sont correctes, mais juste pour ajouter un peu plus de clarté...
Le "read only memory" que les gens font référence à est le segment de texte dans ASM termes. C'est le même endroit de la mémoire où les instructions sont chargées. Il est en lecture seule pour des raisons évidentes de sécurité. Lorsque vous créez un char* initialisé à une chaîne, la chaîne de données est compilé dans le segment de texte et le programme initialise le pointeur dans le segment de texte. Donc, si vous essayez de le changer, kaboom. Erreur de segmentation.
Lorsqu'il est écrit comme un tableau, le compilateur place la initialisée chaîne de données dans le segment de données au lieu de cela, qui est au même endroit que vos variables globales et en direct. Cette mémoire est mutable, car il n'y a pas d'instructions dans le segment de données. Cette fois, lorsque le compilateur initialise le tableau de caractères (ce qui est encore juste un char*) elle est pointée dans le segment de données plutôt que sur le segment de texte, que vous pouvez modifier en toute sécurité au moment de l'exécution.