l’abandon de la constance peut-il conduire à un comportement indéfini?

const int a = 10 int *p = (int*) &a; *p = 20; printf("a = %d", a); 

Est-il possible de sortir 10 ou 20, en fonction du compilateur?

Est-il possible de sortir 10 ou 20, en fonction du compilateur?

Oui, ou même des démons nasaux peuvent apparaître. Le comportement de ce programme n’est pas défini, le code est mal formé, car la modification d’un object const est une violation de contrainte.

Dans son libellé actuel, votre code a un comportement non défini. Vous pouvez donc obtenir 10 ou 20 ou autre chose (par exemple, une violation d’access).

C’est un comportement indéfini:

C11 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.

Oui, c’est un comportement indéfini, et je pense que c’est là que l’on en parle.

C99 section 6.7.3 paragraphe 5

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 l’on tente de faire référence à un object défini avec un type qualifié volatil en utilisant une lvalue avec un type qualifié non volatile, le comportement est indéfini.115)

Lorsque vous faites *p=20 , vous essayez de modifier la valeur d’une constante, ce qui n’est pas autorisé.