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

标签 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_cast 会导致未定义的行为,当所讨论的对象是 const(如本例中的 i)时。但在执行代码后,i 的值仍然是 4,*p1 的值是 10,而 p p1 ans &i 的值 是相同的,即 p1 指向 i 的位置,但取消引用它会给出一些其他值。它是如何发生的?

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

最佳答案

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

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

关于c++ - 存储两个不同值的相同内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25225968/

相关文章:

c - 从不可变字符串返回 const char**

c++ - 如何创建一个四维指针数组?

c - 什么时候应该使用 struct node* head=NULL 和 struct node *head=NULL ?

c - 这两种指针方法的区别

c - 如何修复我的代码以清除链接结构中的节点

c++ - 在 vector 练习中为体系结构x86_64编译C++不明符号

c++ - 计算文件中字母的出现次数

c++ - 使用 GNU make 创建多个预编译头文件

java - 如何将 jpeg 帧从 java 客户端流式传输到 python 服务器

c++ - C++ 中的 Grassfire 算法