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

Same memory location storing two different values

本文关键字:两个 内存 位置 存储      更新时间:2023-10-16

我正在尝试使用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,而pp1&i的值是相同的,即p1指向i的位置,但对它解引用后给出了其他值。这是怎么发生的?

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

试图修改声明为const的对象会触发未定义行为。接下来的就是。"相同的内存位置存储两个不同的值"是一个完全正常的未定义行为的表现。

注:在实际情况中,您观察到的行为是由这样一个简单的事实引起的:当您读取i的值时,编译后的代码甚至不尝试访问它的内存位置。编译器只是在编译时将4替换为i的"已知"值。编译器知道i的值不可能改变,所以没有必要从内存中读取它。即使您销毁了内存中的原始值(这是您尝试做的),它也不会对直接"读取"i的实际代码产生任何影响,因为每次直接读取i的访问都已经在编译时被字面量4所取代。