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