Bonjour,
Comment modifier "salut" avec la déclaration suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part char * const z = "salut";
Bonjour,
Comment modifier "salut" avec la déclaration suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part char * const z = "salut";
La réponse est simple : on ne doit pas la modifier. Le faire ou tenter de le faire détruit le programme.
tu es sûr parcque qu'il me semble que "salut" n'est pas une chaîne constante ?
oups, comme je n'arrive pas à effacer mon message, je le réédite. je voulais dire
mais ce n'est pas la même chose
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char const * const z="salut";
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char * z="salut";
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char z[]="salut";
Si justement le pointeur est constant ici.Envoyé par salseropom
et ce que tu cites après n'est pas l'objet de la question.
tu mélanges pointeur sur char constant et pointeur constant sur char
Hello,
Il ne faut pas le faire car comportement indéfini comme dit Diogene.Envoyé par oranoutan
§6.7.8 item 32 n1124
Il fut un temps où cela était acceptable (pré-normalisation je pense, donc avant 89-90, j'en appelle aux anciens pour plus de précisions) et les compilateurs fournissent généralement des options pour simuler ce comportement (exple: -traditional et -fwritable-strings). MAIS C'EST UNE TRES MAUVAISE IDEE.On the other hand, the declaration
char *p = "abc";
defines p with type ‘‘pointer to char’’ and initializes it to point to an object with type ‘‘array of char’’ with length 4 whose elements are initialized with a character string literal. If an attempt is made to use p to modify the contents of the array, the behavior is undefined.
A+[tcr@dhcpml047 ~]$ cat pasbeau.c
[tcr@dhcpml047 ~]$ gcc pasbeau.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #include <stdio.h> int main(void) { char * s = "salut"; puts(s); s[0] = 'c'; /* ARRGHHH !!! */ puts(s); return 0; }
[tcr@dhcpml047 ~]$ ./a.out
salut
Erreur de segmentation
[tcr@dhcpml047 ~]$ gcc -fwritable-strings pasbeau.c
cc1: note: -fwritable-strings est obsolète, voir la documentation pour les détails
[tcr@dhcpml047 ~]$ ./a.out
salut
calut
Le problème est que tu n'as pas le droit d'écrire dans la zone mémoire occupée par "Salut". Elle est allouée en une zone mémoire autorisée en lecture seule. Ecrire sur cette zone (si on y arrive) provoque un comportement non défini et détruit le programme. Cela va au delà des considérations pointeur constant sur chaîne pas constante , pointeur non constant sur chaîne constante ou ...
Une sage précaution est de le déclarer en pointeur sur char constant pour éviter des maladresses involontaires.
On ne peux pas. "salut" est une chaine non modifiable. Tu aurais d'ailleurs dû écrire :Envoyé par oranoutan
pour être cohérent avec cet état de fait et être prévenu en cas de tentative de modification.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char const * const z = "salut";
D'ailleurs je recommande un meilleur réglage du compilateur qui incite à mettre ce 'const' :
http://emmanuel-delahaye.developpez....tm#cfg_compilo
Partager