Erreur sur modification d'une chaîne de caractère

Zazafell -  
[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 :

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:

1 réponse

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut Zazafell,

Je suppose que
str
est de type
char *
.

Ce code est dès lors incorrect :

str = malloc(sizeof(char)*36);
str = "blablablablablablablablablavla";


Utilise
strcpy
pour 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
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Petite précision :
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.
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
oui, merci de cette précision.

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
str[3] = ' ';
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
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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).
Non. Ca dépend du contexte. L'exemple classique est le parcours de liste chaînée :-p
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
lol, ok
0