Le programme est abandonné lors de l’utilisation de strcpy sur un pointeur de caractère? (Fonctionne bien sur tableau de caractères)

Je suis perplexe quant à pourquoi ce qui suit ne fonctionne pas:

char * f = "abcdef"; strcpy(f, "abcdef"); printf("%s",f); char s[] = "ddd"; strcpy(&s[0], "eee"); printf("%s", s); 

Dans les deux exemples, strcpy a reçu un caractère *, mais sur le premier exemple, il meurt d’une mort atroce.

"abcdef" et "ddd" sont des littéraux de chaîne pouvant résider dans une section en lecture seule de votre espace d’adressage. char s[] = "ddd" garantit que ce littéral est copié dans la stack – il est donc modifiable.

char * f = "abcdef"; définit un pointeur de caractère sur “abcdef” qui est situé dans une zone en lecture seule afin que vous ne puissiez pas écrire à cet endroit

char s[] = "ddd"; définit un tableau de caractères sur la stack qui est accessible en écriture.

Dans le premier exemple, vous avez un pointeur sur un littéral de chaîne. Ce pointeur doit en réalité être const char * , car toute tentative de modification d’un littéral de chaîne constitue un comportement indéfini. Cependant, pour des raisons historiques, vous pouvez utiliser un caractère char * pour le pointer. Mais vous ne devriez toujours pas essayer de le modifier.

Dans la deuxième version, vous avez un tableau standard, dont le contenu a été initialisé pour être équivalent à votre chaîne. C’est modifiable, car c’est votre tableau.

Le premier exemple est un caractère char * à un littéral de caractère (un littéral est "something" ). Les littéraux de caractères sont en lecture seule et toute tentative d’écriture peut entraîner des plantages. Votre premier pointeur devrait vraiment être const char *f = "abcdef"; , qui ne prendra pas strcpy .

L’instruction char * f = "abcdef" atsortingbue un point en mémoire à la chaîne littérale “abcdef”. Toutefois, elle refusera de vous permettre de modifier son contenu jusqu’à ce que la mémoire soit allouée de manière dynamic. Cela équivaut à un caractère const char .
Tout ce que vous faites est de créer un pointeur en mémoire, puis d’écrire sur les 6 octets suivants, ce qui est illégal en C.

Les littéraux de chaîne sont considérés en lecture seule par la plupart des compilateurs. Par conséquent, la mémoire où ils se trouvent peut être marquée en lecture seule, ce qui entraîne une erreur d’exécution.

Pour que cela fonctionne, procédez comme suit:

 char * f = strdup("abcdef"); strcpy(f, "abcdef"); printf("%s",f); free(f); 

Cela crée une copie modifiable de la chaîne dans la mémoire de tas, qui doit bien sûr être libérée à la fin de votre programme.

Vous, se référer à cette

link, pour savoir comment utiliser strcpy pour les pointeurs de caractères.

Veuillez voir les littéraux de chaîne: où vont-ils?