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
Antoine Leca
En ck0k98$2pf$, Laurent Deniau va escriure:
fich_s = (char *) malloc(strlen("Nouvelle chaine"));
Pour cet usage, utlise:


char *fich_s = strdup("Nouvelle chaine");


strdup n'est pas standard.


À choisir entre strdup (non standard mais présent presque partout, et facile
à rajouter s'il le faut) et le bogue classique sans effet pervers trois fois
sur quatre (à cause de l'arrondi de taille que fait malloc),... mon c½ur
balance.

Enfin avec un peu de chance, nous aurons un nouveau qui fera maintenant
attention aux +1, maintenant.

Antoine



Avatar
Marc Boyer
In article <ck0rgu$mir$, Antoine Leca wrote:
En ck0k98$2pf$, Laurent Deniau va escriure:
fich_s = (char *) malloc(strlen("Nouvelle chaine"));
Pour cet usage, utlise:


char *fich_s = strdup("Nouvelle chaine");


strdup n'est pas standard.


À choisir entre strdup (non standard mais présent presque partout, et facile
à rajouter s'il le faut) et le bogue classique sans effet pervers trois fois
sur quatre (à cause de l'arrondi de taille que fait malloc),... mon c½ur
balance.


Surtout que, comme je dis souvent, mieux vaut un code qui ne compile
pas qu'un code qui compile avec un bug.
Bon, après, c'est vrai que faire un code qui ajoute strdup quand
il y est pas mais ne l'ajoute pas s'il y est déjà, ça peut être pénible...

Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...




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

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 !!!


Non. Dans un environnement hégbergé (OS), les allocations statiques
sont libérées automatiquement lorsque le programme se termine. C'est le
système qui s'occupe de ça...

--
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 06/10/04 :

Florent 'flure' C. wrote:

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


Ahlala, si tu avais commencé par apprendre l'assembleur ! ;-)


Le pire, c'est que j'en ai fait beaucoup, y compris professionnellement,
et je n'avais pas fait le lien entre les chaînes statiques en C et celles
en asm. Désolé, honte à moi.


T'as jamais utilisé un debugger ?

--
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 Clairambault wrote on 06/10/04 :
En fait, un prof d'info m'a dis que c'était :
pour char* fich_s;
fich_s = (char *) malloc(strlen("Nouvelle chaine"));

Voila, j'ai l'étrange impression, que c'est pas encore gagné pour tout le
monde la programmation...


Ce prof d'info mérite le goudron et les plumes...

pour char* fich_s = malloc(strlen("Nouvelle chaine") + 1);

--
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
Charlie Gordon wrote on 06/10/04 :
char *fich_s = strdup("Nouvelle chaine");


Attention. Standard Posix (enfin, je crois), mais pas C.

Et il faut naturellement veiller à la libérer (free) à bon escient.


--
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
Marc Boyer wrote on 06/10/04 :
Bon, après, c'est vrai que faire un code qui ajoute strdup quand
il y est pas mais ne l'ajoute pas s'il y est déjà, ça peut être pénible...


Tellement facile à implémenter...

http://mapage.noos.fr/emdel/clib.htm
module STR

STR_dup()

--
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
Charlie Gordon
"Emmanuel Delahaye" wrote in message
news:
Florent Clairambault wrote on 06/10/04 :
En fait, un prof d'info m'a dis que c'était :
pour char* fich_s;
fich_s = (char *) malloc(strlen("Nouvelle chaine"));

Voila, j'ai l'étrange impression, que c'est pas encore gagné pour tout
le


monde la programmation...


Ce prof d'info mérite le goudron et les plumes...

pour char* fich_s = malloc(strlen("Nouvelle chaine") + 1);


Je cite pour l'exemple un bug surprenant que j'ai rencontré plusieurs fois
avec des programmeurs pourtant plus débutants :

char* fich_s = malloc(strlen("Nouvelle chaine" + 1));

Un cas classique de "ca compile donc c'est bon!" ;-)

Chqrlie.


Avatar
Antoine Leca
En ,
Emmanuel Delahaye va escriure:
Charlie Gordon wrote on 06/10/04 :
char *fich_s = strdup("Nouvelle chaine");


Attention. Standard Posix


Même pas. C'est XSI (X/Open, alias Single Unix), un sur-ensemble de Posix,
présent sur tous les systèmes héritiers de Unix mais qui peut manquer sur
les systèmes plus baroques.

Maintenant celui-là en particulier est très souvent présent. Mais c'est
important de savoir quel est la norme impliquée, pour choisir à bon escient
les options de configuration (ici, -D_XOPEN_SOURCE devrait le faire).


Antoine


Avatar
Michel Billaud
"Charlie Gordon" writes:

Je cite pour l'exemple un bug surprenant que j'ai rencontré plusieurs fois
avec des programmeurs pourtant plus débutants :

char* fich_s = malloc(strlen("Nouvelle chaine" + 1));

Un cas classique de "ca compile donc c'est bon!" ;-)


avec -1, ça peut marcher avec une probabilité non nulle.

MB

--
Michel BILLAUD
LABRI-Université Bordeaux I tel 05 4000 6922 / 05 5684 5792
351, cours de la Libération http://www.labri.fr/~billaud
33405 Talence (FRANCE)

1 2 3 4