Différence entre char et char * en C

Quelle est la difference entre char [] s et char * s en C? Je comprends que les deux créent make ‘s’ un pointeur vers le tableau de caractères. cependant,

char s[] = "hello"; s[3] = 'a'; printf("\n%s\n", s); 

imprime helao , tandis que

 char * s = "hello"; s[3] = 'a'; printf("\n%s\n", s); 

me donne une faute de segmentation. Pourquoi y a-t-il une telle différence? J’utilise gcc sur Ubuntu 12.04.

Lorsque vous utilisez char s[] = "hello"; , le tableau de caractères est créé dans la scope de la fonction actuelle, ainsi la mémoire est allouée sur la stack lorsqu’elle entre dans la fonction.

Lorsque vous utilisez char *s = "hello"; , s est un pointeur sur une chaîne constante que le compilateur enregistre dans un bloc de mémoire du programme bloqué pour l’access en écriture, d’où l’erreur de segmentation.

Dans les deux cas, une chaîne constante de caractères "hello\0" est allouée dans une section en lecture seule de l’image exécutable.

Dans le cas de char* s="hello" , la variable s est définie pour pointer sur l’emplacement de cette chaîne en mémoire chaque fois que la fonction est appelée, afin qu’elle puisse être utilisée pour les opérations de lecture ( c = s[i] ) , mais pas pour les opérations d’écriture ( s[i] = c ).

Dans le cas de char s[]="hello" , le tableau s est alloué sur la stack et rempli du contenu de cette chaîne chaque fois que la fonction est appelée, afin de pouvoir être utilisée pour les opérations de lecture ( c = s[i] ) et pour les opérations d’écriture ( s[i] = c ).

L’un est un pointeur, l’autre est un tableau.

Un tableau définit les données qui restnt dans l’espace de stack de la scope actuelle.

Un pointeur définit une adresse mémoire située dans l’espace de stack de la scope actuelle, mais faisant référence à la mémoire du tas.