尝试在C ++中更改全局和局部const值时的行为

时间:2017-06-06 05:39:02

标签: c++ visual-c++

我过去几天学习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变量不是要修改的,但是因为我倾向于从基础知识中探索不同的方式

1 个答案:

答案 0 :(得分:1)

只是因为你可以抛弃const然后通过指向非const的指针写入const变量并不合法。事实上,它是未定义的行为,你的程序形成不良,没有任何意义。在这种情况下,编译器可以自由生成任何代码。