我正在尝试使用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。
答案 0 :(得分:4)
尝试修改声明为const
的对象会触发未定义的行为。其余的如下。 &#34;相同的存储位置存储两个不同的值&#34;是未定义行为的完美正常表现。
P.S。在实际的实际情况中,您观察到的行为是由以下简单事实引起的:当您读取i
的值时,编译的代码甚至不会尝试访问其内存位置。编译器在编译时简单地将4
替换为&#34;已知的&#34;值i
。编译器知道i
的值不可能永远改变,因此实际上没有必要从内存中读取它。即使你破坏了内存中的原始值(这是你试图做的),它也不会对直接&#34;读取&#34;的实际代码产生任何影响。 i
,因为在编译时,i
的每次直接读取访问都已被文字4
替换。