euh non, l'affectation est légale, je ne vois pas le problème... par contre une tentative de modification est illégale (mais il n'y avait pas de modification dans le post original).
"Salut" est une littérale chaînes (constante) et possède une addresse. L'affectation coucou = "Salut" affecte cette adresse à la variable coucou, qui est un pointeur sur char, donc c'est ok.
Contrairement au C++, les littérales chaînes sont de type char * et pas const char * (elles n'en restent pas moins non modifiables); il est donc peut-être préférable d'utiliser un pointeur const char * dans cette situation, afin d'éviter de tenter par mégarde une modification.
Code :
- char *coucou;
- coucou = "Salut";
|
est totalement équivalent à
Code :
- char *coucou = "Salut";
|
Dans les deux situations le pointeur coucou pointera sur une littérale chaîne non modifiable. Par contre
Code :
- char coucou[] = "Salut";
|
est très différent car il alloue un tableau de 6 caractères et y stocke les caractères 'S', 'a', 'l', 'u', 't', '\0'. Ce tableau est lui évidemment modifiable. L'expression 'coucou' est alors un pointeur sur le premier élément du tableau.
Dernière remarque par rapport au premier post, les commentaires // ne sont pas autorisés avant le C99 et le retour de malloc ne se caste pas. Si tu voulais allouer dynamiquement l'espace (ce qui est peu utile ici) tu fais :
Code :
- #include <stdlib.h>
- #include <string.h>
- ...
- char *coucou;
- coucou = malloc(6);
- strcpy(coucou, "Salut" );
|
Tu obtiens alors un pointeur sur un tableau modifiable de 6 caractères.
Message édité par djdie le 26-03-2004 à 11:01:16