我在变量创建期间利用堆栈上的内存分配顺序来改变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 *答案 0 :(得分:3)
原来我可以改变const变量的值。我是否擅自进入未定义行为的领域或是否被允许?
前者,如你所知,UB意味着一切顺利。
我认为程序以与普通变量相同的方式存储const变量。
它可以。有时,确实如此。不是说你应该依赖它。
当我尝试直接访问它时,编译器会主动阻止我更改值。我的意思是说编译器区分const和非const变量,而不是堆栈本身(存储变量)。
如果我能做到这一点,如果我错误地指向一个const变量的位置,我将如何确保变量的常量?
好吧,除非你冒险进入UB的土地,否则没有问题。如果你这样做,就没有办法了。
另外,作为一个附带问题,同样的程序是否也适用于其他语言(当然,在对语法进行必要的更改之后)?
当然,您可以在所有语言中编写非常相似的内容,允许直接访问内存,在大多数其他语言中,您可以查看库并仍然执行那些恶作剧。