Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Petite question simple avec un pointeur

37 réponses
Avatar
Florent Clairambault
Voila, j'ai un :
char *fich_s = "sortie.txt";

Je voudrais pouvoir en changer la valeur, j'ai esayé :
strcpy(fich_s, "sortie-auto.txt");

Ca ne marche pas... Que dois - je faire ???

Florent

10 réponses

1 2 3 4
Avatar
Charlie Gordon
Florent Clairambault" wrote in message
news:cju2os$ci7$
Voila, j'ai un :
char *fich_s = "sortie.txt";

Je voudrais pouvoir en changer la valeur, j'ai esayé :
strcpy(fich_s, "sortie-auto.txt");

Ca ne marche pas... Que dois - je faire ???


Il faut definir un tableau de char plutot qu'un pointeur sur une chaine
littérale, qui est en général constante sur les OS modernes :

char fich_s[MAX_PATH] = "sortie.txt";
// on change le contenu du buffer:
strcpy(fich_s, "sortie-auto.txt");

il faut quand même vérifier que la chaine copiee tient dans le buffer
défini.

Une alternative si toutes les chaines manipulees sont littérales :

char *fich_s = "sortie.txt";
// on change la valeur du pointeur fich_s:
fich_s = "sortie-auto.txt";

Chqrlie.

Avatar
Florent 'flure' C.
Le Tue, 05 Oct 2004 14:34:33 +0200, Charlie Gordon a écrit :

char *fich_s = "sortie.txt";
// on change la valeur du pointeur fich_s: fich_s = "sortie-auto.txt";

Chqrlie.


fouyaya !
Et vivent les fuites de mémoire !
Il vaudrait mieux faire un free(fich_s) avant de changer sa valeur, non ?

--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !

Avatar
Emmanuel Delahaye
Florent 'flure' C. wrote on 05/10/04 :

char *fich_s = "sortie.txt";
// on change la valeur du pointeur fich_s: fich_s = "sortie-auto.txt";


Et vivent les fuites de mémoire !


Ah ?

Il vaudrait mieux faire un free(fich_s) avant de changer sa valeur, non ?


Certainement pas. STP, contente toi de lire le forum. Tu apprendras
beaucoup de choses...

P.S. Ne doit être libéré par free() que ce qui a été alloué par
malloc().

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


Avatar
cedric
Emmanuel Delahaye wrote:
Certainement pas. STP, contente toi de lire le forum. Tu apprendras
beaucoup de choses...


S'il s'était contenté de lire il n'aurait rien appris sur ce coup là :-)

Avatar
Jean-Marc
"cedric" a écrit dans le message de
news:41630a02$0$12332$
Emmanuel Delahaye wrote:
Certainement pas. STP, contente toi de lire le forum. Tu apprendras
beaucoup de choses...


S'il s'était contenté de lire il n'aurait rien appris sur ce coup là :-)


Si, il auraitr appris. Tu as quoté trop court.

Emmanuel a écrit:
P.S. Ne doit être libéré par free() que ce qui a été alloué par
malloc().


Il aurait donc appris. (et il y a de quoi faire...)


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."


Avatar
cedric
Jean-Marc wrote:
Emmanuel a écrit:

P.S. Ne doit être libéré par free() que ce qui a été alloué par
malloc().



Il aurait donc appris.


warning: possible use of citation before initialisation


Avatar
Florent 'flure' C.
Le Tue, 05 Oct 2004 22:59:37 +0200, Jean-Marc a écrit :

Il aurait donc appris. (et il y a de quoi faire...)


D'accord, j'admets mon erreur.
Mais je me pose quand même la question de ce que devient la mémoire dans
un cas comme celui-ci :
char* s = "totototo";
s = "toto";

Arrêtez-moi vite si je me trompe, mais j'ai l'impression que là on
change carrément l'adresse de la chaîne pour la faire pointer sur une
autre. Mais alors, que deviennent les 9 octets précédemment alloués ?
La zone mémoire précédemment pointée par s sera-t-elle rendue
disponible ou bien est-elle perdue jusqu'à la fin de l'exécution du
programme ?
Et si l'on refait :
s = "totototo";
Est-ce qu'alors s aura la même valeur qu'elle avait lors de sa première
initialisation, ou bien encore une nouvelle ?

En bref soit je suis complètement à côté de la plaque, soit je
découvre aujourd'hui quelque chose du C :
1) que je ne comprends pas
2) dont je ne saisis pas l'interêt (n'est-ce pas source d'erreurs ?)

Merci d'avance pour les explications,
--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !

Avatar
Emmanuel Delahaye
cedric wrote on 05/10/04 :
Jean-Marc wrote:
Emmanuel a écrit:

P.S. Ne doit être libéré par free() que ce qui a été alloué par
malloc().


Il aurait donc appris.


warning: possible use of citation before initialisation


'citation'? Tu veux dire 'quote', bien sûr...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"



Avatar
Emmanuel Delahaye
Florent 'flure' C. wrote on 05/10/04 :
Mais je me pose quand même la question de ce que devient la mémoire dans
un cas comme celui-ci :
char* s = "totototo";
s = "toto";



La zone qui contient "totototo" n'est plus accessible. Ca mort pas!

Arrêtez-moi vite si je me trompe, mais j'ai l'impression que là on
change carrément l'adresse de la chaîne pour la faire pointer sur une
autre.


On change la valeur d'un pointeur, c'est tout.

http://mapage.noos.fr/emdel/notes.htm#pointeurs


Mais alors, que deviennent les 9 octets précédemment alloués ?


Ils sont toujours alloués (durée de vie égale à celle du programme)

La zone mémoire précédemment pointée par s sera-t-elle rendue
disponible ou bien est-elle perdue jusqu'à la fin de l'exécution du
programme ?


Elle n'est pas rendue, puisque l'allocation est statique.

Et si l'on refait :
s = "totototo";
Est-ce qu'alors s aura la même valeur qu'elle avait lors de sa première
initialisation, ou bien encore une nouvelle ?


Oui, non, peut être... ce n'est pas défini. Un compilateur raisonnable
devrai donner la même adresse, si il sit faire le 'string merging'.
Question d'implémentation.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Florent 'flure' C.
Le Tue, 05 Oct 2004 23:51:15 +0200, Emmanuel Delahaye a écrit :

Mais alors, que deviennent les 9 octets précédemment alloués ?


Ils sont toujours alloués (durée de vie égale à celle du programme)


C'est donc bien ce que je craignais : une fuite de mémoire !!!


--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !


1 2 3 4