2015-02-03 4 views
-1
#include <stdio.h> 

int main() 
{ 
    const int a=1; 
    printf("a's address is %p\r\n",&a); 
    printf("input a's address\r\n"); 
    int *p=NULL; 
    //here let p point to a; 
    scanf("%p",&p); 
    printf("p point to %p\r\n",p); 
    *p=100; 
    // I suppose a will be 100, but acturlly a is still 1... 
    printf("a's value is %d\r\n",a); 
    printf("*p's value is %d\r\n",*p); 

    return 0; 
} 

Почему a еще 1 и не 100?Что такое переменная const внутри?

Но если я объявляю a как:

int a =1; 

Это работает!

Итак, как это происходит?

+4

В C (предположительно, это то же самое в C++, но я не знаю этого языка), это ** Undefined Behavior ** ((try and)) изменить значение объекта 'const'. Все может случиться. – pmg

ответ

2

В вашем коде есть несколько мест, где вы вызываете неопределенное поведение, а это значит, что все может произойти. a может быть 1, 100 или "puppy".

Во-первых, вы не можете сделать

scanf("%p",&p); 
printf("p point to %p\r\n",p); 
*p=100; 

, потому что вы, вероятно, не принадлежит к этой памяти. Даже если бы вы это сделали, письмо было бы незаконным. Как это имеет место здесь.

Если вы сделаете это (изменить значение в a «s адрес) или используется const_cast, а затем попытаться изменить a, there'a другой экземпляр неопределенного поведения. Вы дали обещание a is const - не меняйте его.

В результате UB и поведение, вероятно, происходит потому, что компилятор оптимизирует printf("a's value is %d\r\n",a); к простому printf("a's value is %d\r\n",1);, так как он доверяет вам, что вы не будете изменять a (позор на него).

0

Когда вы объявляете a как const, компилятор может предположить, что он никогда не может измениться. То, что вы синтезируете указатель на него и пытаетесь изменить его, не имеет значения, потому что (по-видимому) ваш компилятор оптимизировал фактическую загрузку a, когда он равен const.

0

Ключевое слово const указывает, что значение переменной является константой и сообщает компилятору, чтобы он не модифицировал его.

Смежные вопросы