存储两个不同值的相同内存位置

时间:2014-08-10 05:52:51

标签: c++ pointers

我正在尝试使用const指针。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    const int i=4;
    const int *const p=&i;
    int *p1=const_cast<int*>(p);
    *p1=10;
    cout<<p<<" "<<p1<<" "<<&i<<endl;
    cout<<i<<" "<<*p1<<endl;
}

我知道当有问题的对象是const时,使用const_cast导致未定义的行为(在本例中为i)。但是在执行代码之后,i的值仍为4,*p1的值为10,而p p1 ans &i的值相同,即p1指向我的位置,但解除引用它给了一些其他的价值。怎么会发生?

编译:g ++ 4.8.1和clang ++ 3.3。

1 个答案:

答案 0 :(得分:4)

尝试修改声明为const的对象会触发未定义的行为。其余的如下。 &#34;相同的存储位置存储两个不同的值&#34;是未定义行为的完美正常表现。

P.S。在实际的实际情况中,您观察到的行为是由以下简单事实引起的:当您读取i的值时,编译的代码甚至不会尝试访问其内存位置。编译器在编译时简单地将4替换为&#34;已知的&#34;值i。编译器知道i的值不可能永远改变,因此实际上没有必要从内存中读取它。即使你破坏了内存中的原始值(这是你试图做的),它也不会对直接&#34;读取&#34;的实际代码产生任何影响。 i,因为在编译时,i的每次直接读取访问都已被文字4替换。