imbibinebe
:
donc TIGCC "optimise" et ne la crée qu'une seule fois
ouais , pour l'instant c'est ss VC++ que je l'ai compilé mais il fait peut être comme TIGCC ... même si ça m'étonnerais
Et bien tu vas être étonné : VC++ et GCC (et donc TIGCC) optimisent ça en ne créant qu'une seule chaîne.
Kevin> ok, donc il y a une erreur ds la doc de TIGCC(chapitre "ponctuators\quotes"):
for (i = 0; i < 2; i++)
{
char str[] = "Hello";
printf (str);
str[0] = 'a';
}
This program will work as expected (it will display "Hello" twice). But, if you change 'str[]' to '*str',
it will not work as expected (it will display "Hello" and then "aello").
car en changeant str[] en *str on obtient une erreur et pas un "aello" ...
C'est parce que ce qui se passe à ce moment-là est indéfini : sur PC, il y a des mécanismes de protections (gérés par une partie du processeur qui s'appelle la MMU) qui font que dès que tu essayes de modifier qqch que tu n'as pas le droit de modifier, tu as une erreur; sur TI, il n'y a pas de MMU et donc le contenu est effectivement modifié et il n'y a pas d'erreur : seulement, ça va te donner des choses bizarres si tu te fies à ce comportement, par exemple si tu utilises deux fois la chaîne "Hello", les deux chaînes seront modifiées simultanément. Bref, le comportement sur PC est préférable (il te permet de débugger plus facilement).
C'est vrai qu'il faudrait peut-être une remarque en plus insistant sur le fait que c'est interdit de mettre "*str".
le fait que str1[] me donne une copie modifiable ne m'explique tjs pas (enfin vu mon niveau c ptet normal :-D) pourquoi le contenu de str1 et sa propre adresse son identiques
&str1 te donne un pointeur vers un tableau de taille 6. Et un pointeur vers un tableau est ensuite automatiquement converti en un pointeur vers un élément du tableau; c'est effectivement un peu bizarre. Essaye juste d'éviter &str1 (pointeur vers un tableau) parce que tu vas avoir des comportements bizarres, notamment :
char *p=&str1;
return p[0]!=0;
(qui est équivalent à "str1[0] != '\0'", i.e. teste si str1 est non vide) n'a rien à voir avec :
return (&str1)[0]!=0;
(qui est équivalent à "*&str1 != 0" i.e. "str1 != 0" i.e. "str1 != NULL", qui est toujours vrai).
On peut d'ailleurs très bien faire sans pointeurs de tableaux, personnellement je n'en ai utilisé pratiquement jamais (et il y a toujours moyen de contourner).