Erreur sur modification d'une chaîne de caractère
Zazafell
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je tente de modifier une chaine de caractère préalablement créer, malloc, et rempli. Cela me parait tout bête mais j'ai toujours une erreur et je ne comprend pas vraiment celle ci.
Voici le bout de code :
La variable str est déclaré également préalablement. L'erreur se produit sur l'instruction situé entre les deux putchar. str[3] = ' ' donc. Je ne vois pas vraiment pourquoi si quelqu'un à une idée :/
Merci d'avance
Je tente de modifier une chaine de caractère préalablement créer, malloc, et rempli. Cela me parait tout bête mais j'ai toujours une erreur et je ne comprend pas vraiment celle ci.
Voici le bout de code :
str = malloc(sizeof(char)*36); str = "blablablablablablablablablavla"; putchar('O'); str[3] = ' '; putchar('O'); t->terran = str;
La variable str est déclaré également préalablement. L'erreur se produit sur l'instruction situé entre les deux putchar. str[3] = ' ' donc. Je ne vois pas vraiment pourquoi si quelqu'un à une idée :/
Merci d'avance
A voir également:
- Erreur sur modification d'une chaîne de caractère
- Caractère ascii - Guide
- Suivi de modification word - Guide
- Caractère spéciaux - Guide
- Caractere speciaux - Guide
- Chaine tnt gratuite sur mobile - Guide
1 réponse
Salut Zazafell,
Je suppose que
Ce code est dès lors incorrect :
Utilise
http://www.cplusplus.com/reference/cstring/strcpy/
http://www.cplusplus.com/reference/cstring/strncpy/
Là tu devrais aussi utiliser strcpy en vérifiant au préalable que t->terran est de taille suffisante pour accueillir les données copiées.
A moins que tu ne veuilles affecter à
Dal
Je suppose que
strest de type
char *.
Ce code est dès lors incorrect :
str = malloc(sizeof(char)*36); str = "blablablablablablablablablavla";
Utilise
strcpypour copier une chaîne C dans un espace mémoire alloué (ou mieux
strncpy).
http://www.cplusplus.com/reference/cstring/strcpy/
http://www.cplusplus.com/reference/cstring/strncpy/
t->terran = str;
Là tu devrais aussi utiliser strcpy en vérifiant au préalable que t->terran est de taille suffisante pour accueillir les données copiées.
A moins que tu ne veuilles affecter à
t->terran(qui doit être vraisemblablement un
char *) l'adresse mémoire vers laquelle pointe
str, ce qui est une possibilité. Alors tu peux faire l'affectation que tu as faite. C'est toi qui vois.
Dal
Ce code est dès lors incorrect :
str = malloc(sizeof(char)*36);
str = "blablablablablablablablablavla";
C'est pas que c'est incorrect. C'est qu'on alloue une zone en mémoire et qu'on ne pourra plus la libérer par la suite (fuite de mémoire). Ensuite, str pointe sur la première case de la chaîne "blabla..." qui est placée dans une zone en lecture seule.
dans l'absolu, c'est mal (ou "incorrect") d'écraser un pointeur vers une zone mémoire allouée (pour la raison que tu indiques : on ne peut plus la libérer).
mais tu as mis le doigt sur le problème qui découle de l'affectation de str qui pointe alors "sur la première case de la chaîne "blabla..." qui est placée dans une zone en lecture seule" comme tu le dis exactement, et qui s'exprime à la ligne dans la suite du code.
cette ligne tentait effectivement de modifier la chaîne "blabla...", ce qui, étant une constante littérale, ne pouvait rien produire de bon (ou en tout cas rien de prédictible, sauf un plantage probable).
La façon correcte était donc de garder l'espace mémoire alloué et de l'utiliser avec strcpy pour y copier les données, que l'on peut modifier ensuite à loisir (sans oublier le libérer quand on n'en a plus besoin).
Dal
Non. Ca dépend du contexte. L'exemple classique est le parcours de liste chaînée :-p