Gestion de la mémoire dynamique.

Bonjour,

nulentout:
Il semble judicieux de déclarer en const un pointeur. (Au point de vue de l’écriture c’est contradictoire puisque intrinsèquement c’est une variable)
Quel est l’avantage de cette directive, et quel est son effet concret ?

Il faudrait préciser ce que tu entends par «déclarer en const un pointeur» parce que la formulation est ambiguë.

Il y a plusieurs façon d'utiliser le qualificateur const dans la déclaration d'un pointeur :

uint8_t * const pinb = (uint8_t *)0x03;

Dans ce cas c'est le pointeur lui-même qui est constant, c'est-à-dire que l'adresse vers laquelle il pointe ne peut pas être modifiée.

uint8_t const * pinb = (uint8_t *)0x03;

Ici c'est la valeur pointée qui est constante : on peut éventuellement changer l'adresse vers laquelle pointe le pointeur, mais il sera seulement possible de lire le contenu situé à cette adresse, pas y écrire.

Il est bien sûr possible de combiner les deux écritures :

uint8_t const * const pinb = (uint8_t *)0x03;

Ici on a déclaré un pointeur constant vers une valeur de type uint8_t qui est elle-même constante. Autrement dit il pointera toujours vers la même adresse, et le contenu de cette adresse ne pourra pas être modifié par le code.

Et si on combine avec le mot-clé volatile:

uint8_t const volatile * const pinb = (uint8_t *)0x03;

On obtiens un pointeur contant qui pointe vers une valeur elle-même constante qui ne peut pas être modifiée par le code mais qui peut tout de même changer par d'autres moyens (hardware notamment), ce qui signifie que le compilateur n'est pas autorisé à faire d'optimisations en se basant sur le fait que la valeur pointée est constante, mais doit générer une erreur si le programme essaie de la modifier par lui-même.

La recommandation qui d'utiliser le qualificateur const à chaque fois que c'est pertinent n'est pas uniquement liée aux pointeurs. C'est une «bonne pratique» générale qui permet au compilateur de reconnaître les erreurs de programmation.
Pour prendre un exemple, imaginons que je déclare pinb ainsi:

uint8_t * pinb = (uint8_t *)0x03;

Si par la suite je tente de modifier une des broches de ce port avec un code erroné :

pinb = LED_OFF;  // Erreur, il aurait fallu écrire *pinb = LED_OFF;

Comme le pointeur n'a pas été déclaré comme étant constant, le programme va tout simplement modifier l'adresse vers lequel pointe pinb, provoquant un bug qui sera potentiellement très difficile à débusquer. Si le pointeur est déclaré constant, le compilateur se rendre compte qu'il y a un problème, et celui-ci sera réglé aussitôt.

EDIT: corrigé plein de fautes... :slight_smile: