Почему в одной и той же ячейке памяти хранятся разные значения одновременно?

Как одна и та же ячейка памяти может содержать разные значения в следующей программе? Я использую компилятор g++.

код:

#include<iostream>
using namespace std;

int main()
{
   const int i=100;
   int *j = const_cast<int*>(&i);
   *j=1;

   cout<<"The value of i is:"<<i<<endl;
   cout<<"The value j holds:"<<*j<<endl;
   cout<<"The address of i is:"<<&i<<endl;
   cout<<"The address of j is:"< <j<<endl;

}

вывод:

The value of i is:100
The value j holds:1
The address of i is:0xbffbe79c
The address of j is:0xbffbe79c

c++
person Inquisitive    schedule 24.06.2013    source источник
comment
Ну, вы как бы вызвали гнев богов C++, когда изменили его.   -  person chris    schedule 24.06.2013
comment
Компилятор, скорее всего, оптимизирует использование вами i и использует значение 100 непосредственно в вашем операторе cout. Изменение константной переменной является поведением undefined.   -  person Jcl    schedule 24.06.2013
comment
Кроме того, что сказал @chris :-)   -  person Jcl    schedule 24.06.2013
comment
В вашем коде есть ошибка, поэтому, конечно, он не будет делать то, что вы от него ожидаете! Исправьте ошибку, и тайна исчезнет.   -  person David Schwartz    schedule 24.06.2013
comment
Неопределенное поведение не определено   -  person Mike Vine    schedule 24.06.2013
comment
Вы солгали компилятору, значит, он солгал вам. Честность лучшая политика.   -  person Pete Becker    schedule 24.06.2013
comment
Кроме того, вы распечатываете адрес i и значение j, которое является адресом i. Если вы хотите напечатать адрес j, вы должны добавить оператор адреса при печати значения... ;)   -  person Skalli    schedule 25.06.2013


Ответы (2)


У вас неопределенное поведение, так что все может случиться. В этом случае компилятор знает, что i не может изменить значение и, вероятно, просто использует это значение напрямую.

person James Kanze    schedule 24.06.2013
comment
Я не эксперт в области неопределенного поведения, но я чувствую, что если вы разыменуете его адрес, вы получите измененное значение. - person Wug; 24.06.2013
comment
Как я постоянно упоминаю в разделе «Безопасное кодирование в C и C++», как только вы вызываете неопределенное поведение, компилятор может делать все, что захочет, включая вообще ничего. - person Nathan Ernst; 24.06.2013
comment
@Wug Если вы разыменовываете адрес, вы получите значение по этому адресу. Но в этом случае компилятор может предположить, что значение i никогда не меняется. Поскольку он знает, что значение может быть только 100, он просто использует константу 100. Другая возможность заключается в том, что компилятор поместил переменную i в память только для чтения, а *j = 1; вызывает сбой программы. Один из аспектов неопределенного поведения заключается в том, что компилятор может предположить, что этого не происходит, и, как следствие, выполнить оптимизацию. - person James Kanze; 25.06.2013

Память не может хранить разные значения одновременно. Но изменение объекта, который был объявлен const, является неопределенным поведением, так что может случиться что угодно.

Что угодно включает в себя представление того, что в одной и той же ячейке памяти одновременно хранятся разные значения. Происходит следующее: поскольку i не может быть изменено, оно является кандидатом на свертывание констант, поэтому при появлении i в выражении память не задействована.

person K-ballo    schedule 24.06.2013