Quand je regarde le fichier créé avec un éditeur héxadécimal, je
constate que ma chaine de caractere n'est pas enregistré, mais
seulement son adresse (je pense), car j'ai beau changer la chaine,
c'est toujour la meme chose d'enregistré. tandi que le int lui est
bien enregistré dans le fichier.
Pourrais-je avoir la bonne technique pour faire bien cette écriture ?
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
Bah, pourri, pas pourri, c'est tres subjectif. C'est tout a fait correct syntactiquement et semantiquement. Le style n'est pas forcement tres approuve...
Woah la honte, he ! Je me suis fait avoir. Non, que je sois honnete:
j'ai temporairement fondu un fusible, et j'ai ecris n'importe quoi. Pardon. Remplace le paragraphe ci-dessus par:
Non, ce code n'est pas pourri, il est incorrect. Tu essayes de modifier une chaine litterale, ce qui invoque un UB. Tout peut arriver. Selon le systeme que tu utilises il est probable que l'un des trois evenements suivants arrivent:
a) ton programme plante avec une segfault ou equivelent (UNIXoide) b) ca passe sans planter, mais si tu fais: "toto"[0] = ' '; puts("toto"); l'output de ton programme sera "toto" (sans les guillemets, bien sur) c) ca passe sans planter, mais l'output de "toto"[0] = ' '; puts("toto"); sera "" (i.e. une ligne vide), parce que ton compilateur a factorise toutes les chaines litterales identiques en une seule (ce qui est tout a fait legitime etant donne la supposition que les chaines litterales sont non-modifiables).
Bref, je digresse. Au final, dans le contexte de ce NG, le comportement de "toto" = ' '; n'a pas d'importance. L'important est que c'est un UB et que, pour du code portable, tu NE dois PAS faire des suppositions quand a son comportement.
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
Bah, pourri, pas pourri, c'est tres subjectif. C'est tout a fait correct
syntactiquement et semantiquement. Le style n'est pas forcement tres
approuve...
Woah la honte, he ! Je me suis fait avoir. Non, que je sois honnete:
j'ai temporairement fondu un fusible, et j'ai ecris n'importe quoi.
Pardon. Remplace le paragraphe ci-dessus par:
Non, ce code n'est pas pourri, il est incorrect. Tu essayes de modifier
une chaine litterale, ce qui invoque un UB. Tout peut arriver. Selon le
systeme que tu utilises il est probable que l'un des trois evenements
suivants arrivent:
a) ton programme plante avec une segfault ou equivelent (UNIXoide)
b) ca passe sans planter, mais si tu fais: "toto"[0] = ' ';
puts("toto"); l'output de ton programme sera "toto" (sans les
guillemets, bien sur)
c) ca passe sans planter, mais l'output de "toto"[0] = ' ';
puts("toto"); sera "" (i.e. une ligne vide), parce que ton compilateur a
factorise toutes les chaines litterales identiques en une seule (ce qui
est tout a fait legitime etant donne la supposition que les chaines
litterales sont non-modifiables).
Bref, je digresse. Au final, dans le contexte de ce NG, le comportement
de "toto" = ' '; n'a pas d'importance. L'important est que c'est un UB
et que, pour du code portable, tu NE dois PAS faire des suppositions
quand a son comportement.
"toto"[0] = ' ', est-il du C pourri, ou n'est-il pas du C ?
Bah, pourri, pas pourri, c'est tres subjectif. C'est tout a fait correct syntactiquement et semantiquement. Le style n'est pas forcement tres approuve...
Woah la honte, he ! Je me suis fait avoir. Non, que je sois honnete:
j'ai temporairement fondu un fusible, et j'ai ecris n'importe quoi. Pardon. Remplace le paragraphe ci-dessus par:
Non, ce code n'est pas pourri, il est incorrect. Tu essayes de modifier une chaine litterale, ce qui invoque un UB. Tout peut arriver. Selon le systeme que tu utilises il est probable que l'un des trois evenements suivants arrivent:
a) ton programme plante avec une segfault ou equivelent (UNIXoide) b) ca passe sans planter, mais si tu fais: "toto"[0] = ' '; puts("toto"); l'output de ton programme sera "toto" (sans les guillemets, bien sur) c) ca passe sans planter, mais l'output de "toto"[0] = ' '; puts("toto"); sera "" (i.e. une ligne vide), parce que ton compilateur a factorise toutes les chaines litterales identiques en une seule (ce qui est tout a fait legitime etant donne la supposition que les chaines litterales sont non-modifiables).
Bref, je digresse. Au final, dans le contexte de ce NG, le comportement de "toto" = ' '; n'a pas d'importance. L'important est que c'est un UB et que, pour du code portable, tu NE dois PAS faire des suppositions quand a son comportement.