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

je comprends plus rien...

8 réponses
Avatar
Stephane Legras-Decussy
bonjour,

je suis tout désapointé devant ce code :

#include <stdio.h>
#include <stdlib.h>

int main()
{
char *s;

s = "abcd";
printf("%s",s);
s = "xyz";
printf("%s",s);

return 0;
}

0 warning 0 error et affichage correct abcdxyz

sauf que pour moi ça ne devrait même pas compiler...

je suis peut être super pas reveillé mais
pour moi il faut reserver l'espace memoire et copier la
chaine par strcpy...

quelqu'un peut m'expliquer ?

merci

8 réponses

Avatar
Etienne Rousee
Stephane Legras-Decussy a écrit :
char *s;

s = "abcd";
printf("%s",s);
s = "xyz";
printf("%s",s);
sauf que pour moi ça ne devrait même pas compiler...



Il n'y a pas de raison, c'est syntaxiquement correct.

je suis peut être super pas reveillé mais
pour moi il faut reserver l'espace memoire et copier la
chaine par strcpy...



Non, car l'instruction s = "abcd" ne fait qu'affecter
l'adresse de "abcd" à la variable s, ce qui est correct
syntaxiquement, donc passe à la compilation, et en plus
ne pose pas de problème à l'exécution.
Ce n'est pas la même chose que recopier le contenu d'une chaîne.
Par contre, un strcpy sans réservation de mémoire provoquerait
un plantage à l'exécution, un *s = ... aussi.

--

Etienne
Avatar
Stephane Legras-Decussy
"Etienne Rousee" a écrit dans le message de news:
4990ca74$0$18391$
Non, car l'instruction s = "abcd" ne fait qu'affecter
l'adresse de "abcd" à la variable s, ce qui est correct
syntaxiquement, donc passe à la compilation, et en plus
ne pose pas de problème à l'exécution.
Ce n'est pas la même chose que recopier le contenu d'une chaîne.
Par contre, un strcpy sans réservation de mémoire provoquerait
un plantage à l'exécution, un *s = ... aussi.



ok, je viens de lire aussi la partie du
site de emdel qui explique ça, c'est ok maintenant...

merci
Avatar
Sylvain SF
Stephane Legras-Decussy a écrit :

ok, je viens de lire aussi la partie du
site de emdel qui explique ça, c'est ok maintenant...



je connais pas m. emdel mais la notion de 'data segment'
existe depuis ... toujours ou presque.

SF.
Avatar
espie
In article <4990c458$0$3517$,
Stephane Legras-Decussy wrote:
bonjour,

je suis tout désapointé devant ce code :

#include <stdio.h>
#include <stdlib.h>

int main()
{
char *s;

s = "abcd";
printf("%s",s);
s = "xyz";
printf("%s",s);

return 0;
}

0 warning 0 error et affichage correct abcdxyz



Par contre, ca n'est pas garanti afficher correctement, car ta derniere
ligne ne finit pas par un n...
Avatar
Jean-Marc Bourguet
Sylvain SF writes:

Stephane Legras-Decussy a écrit :
> ok, je viens de lire aussi la partie du
> site de emdel qui explique ça, c'est ok maintenant...

je connais pas m. emdel mais la notion de 'data segment'



Emmanuel Delahaye un ancien habitue qui signait -ed- pendant pas mal de
temps. Il participe toujours mais beaucoup moins regulierement.

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
-ed-
On 10 fév, 02:52, Sylvain SF wrote:
Stephane Legras-Decussy a écrit :



> ok, je viens de lire aussi la partie du
> site de emdel qui explique ça, c'est ok maintenant...

je connais pas m. emdel mais la notion de 'data segment'
existe depuis ... toujours ou presque.

SF.



Coucou, c'est moi !

http://mapage.noos.fr/emdel/index.htm

A+
Avatar
candide
Marc Espie a écrit :
In article <4990c458$0$3517$,



s = "xyz";
printf("%s",s);

return 0;
}

0 warning 0 error et affichage correct abcdxyz



Par contre, ca n'est pas garanti afficher correctement, car ta derniere
ligne ne finit pas par un n...



Tu fais allusion à la faq 14.6 ? Pourtant return 0 dans main() est équivalent à
un appel de exit(0) lequel, à la différence de abort(), vide (au sens de la
fonction flush()) les tampons des flux sortants, non ?
Avatar
espie
In article <49949ebd$0$25553$,
candide wrote:
Marc Espie a écrit :
In article <4990c458$0$3517$,



s = "xyz";
printf("%s",s);

return 0;
}

0 warning 0 error et affichage correct abcdxyz



Par contre, ca n'est pas garanti afficher correctement, car ta derniere
ligne ne finit pas par un n...



Tu fais allusion à la faq 14.6 ? Pourtant return 0 dans main() est équivalent à
un appel de exit(0) lequel, à la différence de abort(), vide (au sens de la
fonction flush()) les tampons des flux sortants, non ?



Oui, ce qui ne change rien au fait qu'il peut arriver des trucs a une
ligne non complete.

Par exemple, sur un systeme Unix, tu n'as aucune garantie que ton shell
ne se contente pas de remplacer ta jolie ligne par son invite...