Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Изменение константной переменной

#cpp #указатели #const


в main() написал следующее

int const a=10;  
int *p=(int*)(&a);     
*p=20;  
cout<< a << endl;  
cout<< *p << endl;  
return 0;  


В отладчике наблюдаю изменение значения переменной "a" с 10 на 20. Но на экран выводится
10 и 20. То есть хоть и явно изменил константную переменную(знаю, что так нельзя делать,
просто протестил) на экран вывелось прежнее значение. Запускал под виндой и под ubuntu
на виртуалке. Почему же все-таки выводится 10 20, а не 20 20?
    


Ответы

Ответ 1



Компилятор видит, что a - это константа. Значит, она поменятся не может (он на это имеет право рассчитывать). Соответсвенно, когда он видит вывод переменной a - он имеет законное право подставить готовое известное значение. То есть, компилятор преобразует это в такое int const a=10; int *p=(int*)(&a); *p=20; cout<< 10 << endl; cout<< *p << endl; return 0; И сколько переменная не меняется, значение будет все равно выводиться не то, которое Вы ожидаете.

Ответ 2



Компилятор "знает", что a не меняется, поэтому и выводит первоначальное значение. Добавьте атрибут volatile (он говорит о том, что значение памяти может меняться независимо от создаваемого компилятором кода) и посмотрите: volatile int const a=10; int *p=(int*)(&a); *p=20; cout<< a << endl; cout<< *p << endl; return 0; теперь avp@wubu:hashcode$ g++ tt.cpp && ./a.out 20 20 avp@wubu:hashcode$

Ответ 3



C массивом прокатило без volatile. изменил и вывел изменённое значение const int arr[2][2]={{1,2},{3,4}}; int *p=(int *)((arr[1]+1)); cout<<"before"<

Комментариев нет:

Отправить комментарий