【发布时间】:2015-08-26 11:29:36
【问题描述】:
场景 1:当 const 变量在 main() 内声明时,即本地化
#include <stdio.h>
#include <conio.h>
main()
{
const int a = 45;
* ((int*)&a)=50;
printf("%d\n",a);
getch();
}
输出MVC++:
a=50
场景 2:当 const 变量在 main() 之外声明时,即全局化
#include <stdio.h>
#include <conio.h>
const int a = 45;
main()
{
* ((int*)&a)=50;
printf("%d\n",a);
getch();
}
输出MVC++:
未处理的异常...访问冲突。
我了解为什么在尝试修改全局定义的 const 变量时会出错。但是,为什么当我尝试修改本地定义的 const 变量时没有收到错误消息?
【问题讨论】:
-
您不会收到错误消息,因为 C 风格的强制转换会默默地抛弃 constness。这只是你永远不应该使用 C 风格转换的原因之一
-
正如其他人所说,你有未定义的行为,所以两者都很糟糕。也就是说,全局变量倾向于崩溃的原因是操作系统加载程序可以将所有全局常量放入内存并将其标记为只读,因此您会收到一个很好的访问冲突消息。局部变量可能在堆栈上,并且在创建和销毁自动变量时,在 CPU 级别上不断地临时生成堆栈的一部分
const是不切实际的(由于内存页面大小的影响和性能损失) . -
@Tony D 感谢您提供如此详细的解释。它真的帮助了我。
-
我投票决定将此问题作为题外话结束,因为今天的“我做了一件明显很糟糕的事情,我希望它得到解释”是“我通过指针更改了 const”。 DownCloseVote....