assigning to const int via pointer

Sriharsha sriharsha.v@redpinesignals.com
Mon Jan 3 06:57:00 GMT 2005


Got it now. Thank you.

Ian Lance Taylor wrote:

>Sriharsha <sriharsha.v@redpinesignals.com> 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.
>>    
>>
>
>Yes.
>
>  
>
>>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.
>>    
>>
>
>No.  Note that the rule is about modifying "an object".  The object in
>question was defined by the definition of 'x', and thus was defined
>using a const-qualified type.  The assignment through 'ptr' is
>modifying an object defined with a const-qualified type.
>
>  
>
>>According to the rule, you cannot use the variable, declared as a
>>const-qualified type, on the left hand side (lvalue, or assigned-to
>>variable), but it does not say anything about the memory being
>>modified.
>>    
>>
>
>No.  The rule I quoted doesn't say that you can't use a
>const-qualified type as an lvalue.  It says that you can't use an
>lvalue with a non-const-qualified type to modify an object defined
>with a const-qualified type.  *ptr is an lvalue with a
>non-const-qualified type.  It is being used to modify the object
>defined by the declaration of x with a const-qualified type.
>
>  
>
>>Please correct me if I am wrong. Also, when you qualify the type of x
>>to be a volatile, then the behaviour is as expected. So, there must be
>>some other reason why the variable "int *ptr" is being discarded by
>>Optimization. Check out that without optimization, you are able to
>>change the contents. Also, I've tried this with a few other compilers
>>(without optimization) and they all change the contents.
>>    
>>
>
>The program performs undefined behaviour.  Therefore the compiled
>results are unpredictable.  It is not surprising that the behaviour is
>different among different compilers and different optimization levels.
>
>Ian
>
>  
>

-- 
 *****************************
 * Sriharsha Vedurmudi			
 * Software Engineer		
 * 
 * Redpine Signals Inc.	
 * Gate #395, Plot 87,88			
 * Sagar Society, Road #2, 
 * Banjara Hills,		
 * Hyderabad - 500 034			
 * www.redpinesignals.com	
 *							
 * +91-40-23559911  (Office)
 * +91-98851-37338  (Mobile)
 *****************************



More information about the Gcc-help mailing list