【问题标题】:changing const values via pointers c++通过指针 C++ 改变 const 值
【发布时间】:2016-11-19 15:58:57
【问题描述】:

我在变量创建期间利用堆栈上的内存分配顺序来更改 const int 的值。这是程序:

//compiled this using C++14 standard on cpp.sh and on MinGW32
#include <iostream>
using namespace std;
int main()
{
    int c=5;
    const int a(c);
    cout<<(&c+1)<<endl<<&a<<endl;   //Verifying if the addresses are the same
    (*(&c+1))++;
    cout<<a<<endl;
}

原来我可以改变 const 变量的值。我是在侵入未定义行为的领域还是被允许?

我认为程序以与普通变量相同的方式存储 const 变量。当我尝试直接访问它时,编译器会主动阻止我更改值。我的意思是说编译器区分 const 和非 const 变量,而不是堆栈本身(存储变量的地方)。

如果我能做到这一点,如果我错误地指向 const 变量的位置,我将如何确保变量的 const 性?

另外,作为一个附带问题,这个相同的程序是否也可以在其他语言中运行(当然是在对语法进行必要的更改之后)?

注意:这与其他关于通过指针更改 const 值的问题有点不同。他们使用显式转换为 int* 将指针从 const int * 转换为 int*。

【问题讨论】:

  • &amp;c+1 不是一个有效的指针,所以你不能取消引用它。
  • “我是在侵入未定义行为的领域还是允许?” --怎么想?!
  • 至于这是否适用于其他语言,好吧,您可以尝试看看在 JavaScript 和 ML 中会发生什么?
  • @BoPersson 这是一个有效的指针,但不能取消引用。
  • @Deduplicator:这是因为第 5.7/4 节中的脚注说 “出于此目的,不是数组元素的对象被认为属于单元素数组” 并且因为该段落允许指向最后一个元素的指针?

标签: c++ pointers constants


【解决方案1】:

原来我可以改变 const 变量的值。我是在侵入未定义行为的领域还是被允许?

前者,如您所知,UB 意味着任何事情都会发生。

我认为程序存储 const 变量的方式与普通变量相同。

可以。有时,确实如此。并不是说你应该依赖它。

当我尝试直接访问它时,编译器会主动阻止我更改值。我的意思是说编译器区分 const 和非 const 变量,而不是堆栈本身(变量存储在其上)。
如果我能做到这一点,如果我错误地指向 const 变量的位置,我将如何确保变量的 const-ness?

好吧,除非你冒险进入 UB 的土地,否则没有问题。如果你这样做了,就没有办法了。

另外,作为一个附带问题,这个相同的程序是否也可以在其他语言中工作(当然是在对语法进行必要的更改之后)?

当然,您可以在所有允许直接内存访问的语言中编写非常相似的内容,在大多数其他语言中,您可以浏览库并仍然进行那些恶作剧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多