我过去几天学习C ++,在了解const qualifier
时尝试了以下内容:
const int m = 10;
int main()
{
int* lptr;
int* gptr;
const int i = 20;
lptr = (int *)&i;
*lptr = 40; //line 1
cout<<i<<endl;
cout<<*lptr<<endl;
*gptr = (int*)&m;
*gptr = 50; //line 2
cout<<m<<endl;
cout<<*gptr<<endl;
}
在这里,由于我明确地将const int*
转换为int*
,因此代码编译完全没问题。在line 1
中,我惊讶地发现没有运行时错误(访问冲突)。但是在line 2
中有一个运行时错误,说write access violation
(这是因为const变量放在ro内存中)。但是这里为什么允许通过lptr
修改本地const变量。 堆栈中是否还有只读内存? (如果它没有那么使用const局部变量是多么安全,因为它可以用指针修改)
*我正在使用MSVC ++ 14.0 *
我知道const变量不是要修改的,但是因为我倾向于从基础知识中探索不同的方式
答案 0 :(得分:1)
只是因为你可以抛弃const然后通过指向非const的指针写入const变量并不合法。事实上,它是未定义的行为,你的程序形成不良,没有任何意义。在这种情况下,编译器可以自由生成任何代码。