通过指针c ++改变const值

时间:2016-11-19 15:58:58

标签: c++ pointers const constants

我在变量创建期间利用堆栈上的内存分配顺序来改变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变量的位置,我将如何确保变量的常量?

另外,作为一个附带问题,同样的程序是否也适用于其他语言(当然,在对语法进行必要的更改之后)?

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

的int *

1 个答案:

答案 0 :(得分:3)

  

原来我可以改变const变量的值。我是否擅自进入未定义行为的领域或是否被允许?

前者,如你所知,UB意味着一切顺利。

  

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

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

  

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

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

  

另外,作为一个附带问题,同样的程序是否也适用于其他语言(当然,在对语法进行必要的更改之后)?

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