Sriharsha <sriharsha.v@xxxxxxxxxxxxxxxxxx> writes: | Ian Lance Taylor wrote: | | >Joe Steeve <joe_steeve@xxxxxxx> writes: | > | > | >>The following code assigns a value to a `const int` via a | >>pointer., | >> | >>#include <stdio.h> | >> | >> int main() | >>{ | >> const int x=5; | >> int *ptr; | >> ptr = &x; | >> *ptr = 10; | >> printf("%d",x); | >>} | >> | >>The code gives `10` for the following compilation | >> | >> $gcc -o test test.c | >> | >>It gives `5` when using optimisations switches., | >> | >> $gcc -o test -O2 test.c | >> | >> Feature or bug or any explanation for this? | > | >When you declare that the variable is const, you are declaring that | >the value does not change. When you do change it, you are using | >undefined behaviour. When the compiler sees undefined behaviour, it | >does not behave predictably. | > | >ISO C99 6.7.3: "If an attempt is made to modify an object defined with | >a const-qualified type through use of an lvalue with | >non-const-qualified type, the behavior is undefined." | > | I am a little confused. The rule says: | If an attempt is made to modify an object, defined with a | const-qualified type, through use of an lvalue with a | non-const-qualified type, the behavior is undefined. | | Now, in the above, program, we are not trying to alter the value of | the variable x as follows: | x = 10; | | But we are trying to alter the contents of a memory location, which | happens to be where the variable 'x' refers to, by using a pointer, | which is defined behaviour. which is precisely what the rule outlaws. -- Gaby