je comprends plus rien...

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Etienne Rousee
Le #18630591
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
Stephane Legras-Decussy
Le #18630631
"Etienne Rousee" 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
Sylvain SF
Le #18630681
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.
espie
Le #18630721
In article Stephane Legras-Decussy wrote:
bonjour,

je suis tout désapointé devant ce code :

#include #include
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...
Jean-Marc Bourguet
Le #18631361
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'



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
-ed-
Le #18631351
On 10 fév, 02:52, 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.



Coucou, c'est moi !

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

A+
candide
Le #18655501
Marc Espie a écrit :
In article


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 ?
espie
Le #18655491
In article candide
Marc Espie a écrit :
In article


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...
Publicité
Poster une réponse
Anonyme