Pointeur sur constante non constante
Salut!:D
J'ai vu dans la FAQ C la possibilité de déclarer des pointeurs sur constante.
Mais en faisant des tests je me suis aperçu que l'on pouvait contourner la constance des données:
Code:
1 2 3
| int const a=10;
int * p=&a;
(*p)++; |
marche et incrémente une constante en passant par son pointeur.
Code:
1 2 3
| int a=10;
int const * p=&a;
a++; |
marche et incrémente la valeur *p en passant par la variable pointée.
Quelle est alors l'utilité de déclarer des pointeurs sur constantes
si les données pointées n'ont pas été précedemment déclarées comme constantes? :roll:
Merci de m'éclairer.
Re: Pointeur sur constante non constante
Citation:
Envoyé par seriousme
Code:
1 2 3
| int const a=10;
int * p=&a;
(*p)++; |
marche et incrémente une constante en passant par son pointeur.
Le compilateur, si il est correctement regle signale ce probleme :
Citation:
main.c:9: warning: initialization discards qualifiers from pointer target type
Ce qui est bien l'effet recherche par const.
Citation:
Envoyé par seriousme
Code:
1 2 3
| int a=10;
int const * p=&a;
a++; |
marche et incrémente la valeur *p en passant par la variable pointée.
a n'etant pas constante, il est tout a fait normal que a++ fonctionne.
Citation:
Envoyé par seriousme
Quelle est alors l'utilité de déclarer des pointeurs sur constantes
si les données pointées n'ont pas été précedemment déclarées comme constantes? :roll:
Les deux utilisations les plus courantes des pointeurs sur constantes sont :
Code:
const char* p="ma chaine";
"ma chaine" etant une chaine pouvant etre place dans une zone memoire en read only (depend de l'implementation), cette ecriture empeche l'ecriture de p[0]='t' qui pourrait provoquer une erreur a l'execution
Dans les prototypes de fonction, ce qui indique que les donnees situe a l'adresse contenue dans le pointeur ne seront pas modifiees. Ici le const permet d'eviter les erreurs de codage dans la fonction et a en plus un role documentaire vis a vis de l'utilisateur de la fonction
Re: Pointeur sur constante non constante
Citation:
Envoyé par seriousme
J'ai vu dans la FAQ C la possibilité de déclarer des pointeurs sur constante.
Si il y a écrit 'constante', c'est une erreur qu'il faut corriger. Le qualificateur 'const' qualifie l'objet de 'accès à lecture seule'. Rien à voir avec une [expression ]constante.
Citation:
Mais en faisant des tests je me suis aperçu que l'on pouvait contourner la constance des données:
Code:
1 2 3
| int const a=10;
int * p=&a;
(*p)++; |
marche et incrémente une constante en passant par son pointeur.
Au prix d'un warning et d'un comportement indéfini. Non, ça ne 'marche ' pas.
Citation:
Code:
1 2 3
| int a=10;
int const * p=&a;
a++; |
marche et incrémente la valeur *p en passant par la variable pointée.
Ca, par contre, c'est parfaitement légal. On peut avoir un pointeur const sur une variable, qui interdit à cette variable d'être accessible en écriture via ce pointeur.
Le typage est faible en C, car on peut toujours le contourner avec un cast. Mais le fait que le code soit compilable, même sans warning, ne signifie pas que le comporteùent soit défini pour autant.
Le C s'adresse à des gens qui respèctent les intentions du programmeur, notamment celles exprimées par les qualificateurs comme 'const'.
Si on s'amuse à passer outre, le comportement est indéfini. Point.