#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"<
Комментариев нет:
Отправить комментарий