Confusion concernant la modification de la variable const à l’aide de pointeurs

L’exemple suivant a ajouté de la confusion dans ma compréhension. Je suis incapable de comprendre comment est-il possible de modifier la variable const locale. S’il vous plaît aidez-moi à comprendre la même chose.

/* Comstack code without optimization option */ // volatile.c #include  int main(void) { const int local = 10; int *ptr = (int*) &local; printf("Initial value of local : %d \n", local); *ptr = 100; printf("Modified value of local: %d \n", local); return 0; } 

$ gcc volatile.c -o volatile -save-temps

$ ./volatile

Valeur initiale de local: 10

Valeur modifiée de local: 100

Ce comportement est tout simplement indéfini si nous examinons le paragraphe 4 de l’avant-projet de norme C99, section 6.7.3 qualificatifs de type :

Si vous tentez de modifier un object défini avec un type qualifié de const en utilisant une valeur lvalue avec un type non qualifié de const, le comportement est indéfini. Si vous tentez de faire référence à un object défini avec un type qualifié volatile par l’utilisation d’une valeur lvalue avec un type qualifié non volatile, le comportement est indéfini. 115)

Donc, vous ne pouvez avoir aucune attente sur les résultats et vous ne devriez pas le faire.

Au paragraphe 2, on lit:

Les propriétés associées aux types qualifiés ne sont significatives que pour les expressions qui sont des valeurs. 114)

et la note de bas de page 114 dit:

L’implémentation peut placer un object const qui n’est pas volatil dans une région de stockage en lecture seule. De plus, l’implémentation n’a pas besoin d’allouer de mémoire pour un tel object si son adresse n’est jamais utilisée.

En général, l’implémentation ne doit pas forcément faire en sorte que les variables const soient en lecture seule, mais cela peut arriver, mais comme le fait remarquer R .., placer une variable automatique dans une mémoire en lecture seule serait difficile.

C’est possible parce que ptr pointe sur un int , pas sur un const int , vous pouvez donc écrire sur l’adresse mémoire contenue dans ptr . Il n’y a rien de plus que ça, vraiment.

const ne marque pas réellement un emplacement mémoire en lecture seule; le fait qu’il soit réellement en lecture seule ou non n’est pas vraiment défini par le standard de langage. Ce n’est généralement pas le cas (comme vous l’avez découvert), mais vous ne devriez toujours pas y écrire.