Différence entre la chaîne créée par un tableau et un pointeur?

Dupliquer possible:
Quelle est la difference entre char s [] et char * s en C?

Quelle est la différence entre ceci:

char arr[] = "Hello, world!"; 

Et ça:

 char *arr = "Hello, world!"; 

Où sont allouées la mémoire des deux chaînes? Pourquoi ne puis-je pas modifier le contenu de cette dernière chaîne?

Le premier est la mémoire inscriptible allouée spécifiquement à arr , qui est un tableau de caractères. Vous pouvez le modifier sans invoquer un comportement indéfini . C’est complètement légal:

 char arr[] = "Hello, world!"; arr[1] = 'i'; 

Le second est un pointeur sur une chaîne en lecture seule. Il s’agit donc d’ un comportement indéfini :

 char *parr = "Hello, world!"; parr[1] = 'i'; // Cannot write to read-only memory! 

Dans certaines implémentations du compilateur:

 char *a = "Hello, world!"; char *b = "Hello, world!"; a[1] = 'i'; // b[1] == 'i'; 

Cela n’est pas garanti – je l’inclue uniquement pour vous donner une idée «intuitive» de la raison pour laquelle il s’agit d’ un comportement non défini .