char * const p = "hello";
définit un pointeur constant p
et il initialise avec l'adresse de mémoire d'une chaîne constante "hello"
qui est en soi de type const char *
. Par cette affectation, vous supprimez un qualificatif const
. C'est un C valide, mais conduira à un comportement indéfini si vous ne savez pas ce que vous faites.
esprit que const char *
vous interdit de modifier le contenu de la mémoire pointée, mais ne l'empêche pas de changer l'adresse en char * const
permet vous de modifier le contenu, mais fixe l'adresse. Il existe également une version combo const char * const
.
Bien que ce code C soit valide, en fonction de l'emplacement de votre système d'exploitation et des restrictions sur "hello"
, il peut ou non se retrouver dans la mémoire inscriptible. Ceci est laissé indéfini. En règle générale, les chaînes de caractères constantes font partie du texte du programme exécutable et sont en lecture seule. Ainsi, en essayant d'écrire à *p
, vous obtenez une erreur d'autorisation de mémoire SIGSEGV
.
La manière correcte est de copier le contenu de la chaîne à la pile et y travailler:
char p[] = "hello";
Maintenant, vous pouvez modifier *p
car il est situé sur la pile qui est en lecture/écriture. Si vous en avez besoin globalement, placez-le dans la portée globale.
Cela ne semble même pas devoir être compilé. La première ligne de 'main' manque un point-virgule, pour un. – Gian
"bonjour" est un littéral et stocké en memmory statique, il ne peut pas être modifié. – BillHoo
http://stackoverflow.com/questions/890535/what-is-the-difference-between-char-const-and-const-char/890560#890560 Rappelez-vous que, en règle générale, chaque fois que vous êtes en utilisant 'const' vous déclenchez des actions internes effectuées par le compilateur. – user2485710