相同的内存位置存储两个不同的值
Same memory location storing two different values
我正在尝试使用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
和&i
的值是相同的,即p1指向i的位置,但对它解引用后给出了其他值。这是怎么发生的?
使用:g++ 4.8.1和clang++ 3.3编译。
试图修改声明为const
的对象会触发未定义行为。接下来的就是。"相同的内存位置存储两个不同的值"是一个完全正常的未定义行为的表现。
注:在实际情况中,您观察到的行为是由这样一个简单的事实引起的:当您读取i
的值时,编译后的代码甚至不尝试访问它的内存位置。编译器只是在编译时将4
替换为i
的"已知"值。编译器知道i
的值不可能改变,所以没有必要从内存中读取它。即使您销毁了内存中的原始值(这是您尝试做的),它也不会对直接"读取"i
的实际代码产生任何影响,因为每次直接读取i
的访问都已经在编译时被字面量4
所取代。
相关文章:
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- Directx 12 :在两个进程之间共享图形内存
- 为什么 valgrind 报告两个内存分配,而我的代码只请求一个?
- 如何在c/c++中检查两个任意内存范围是否重叠
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 为什么一个接一个声明的两个变量在内存中不相邻?
- C++合并两个内存块?
- 为什么动态分配的两个变量的内存位置不是连续的?
- 如何将来自闪存中不同银行的两个内存区域交换为STM32L475
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 为什么当我在同一内存中各有两个指针时,我必须调用"delete"两次?
- 两个内联程序集调用与一个内联程序集调用中的内存损坏?
- C 中的内存模型:为什么在同一内存位置分配了结构中的两个整数
- 两个进程之间的共享映射内存在编辑时未更新
- 为什么两个指针都有相同的内存地址
- 创建两个或多个std::向量时没有bad_alloc,它们一起超过了内存(MSVC)
- 是否必须在内存中"next to each other"两个相邻声明的公共字段?
- 比较快速两个内存区域
- 这两个内存集有什么区别?