use*_*487 4 c c++ pointers const
该变量i被声明为const但我仍然可以使用指向它的内存位置的指针来更改该值.这怎么可能?
int main()
{
const int i = 11;
int *ip = &i;
*ip=100;
printf("%d\n",*ip);
printf("%d\n",i);
}
Run Code Online (Sandbox Code Playgroud)
当我编译时,我得到这个警告:
test.c: In function ‘main’:
test.c:11: warning: initialization discards qualifiers from pointer target type
Run Code Online (Sandbox Code Playgroud)
输出就是这个
100
100
Run Code Online (Sandbox Code Playgroud)
const是一个编译时功能.
它不会阻止你在脚下射击自己; 这是警告的内容.
这const不是对编译器的请求,使其无法更改该变量.相反,它是对编译器的承诺,你不会.如果你违背诺言,你的程序可以做任何事情,包括崩溃.
例如,如果我使用具有-O2优化级别的gcc编译示例代码,则输出为:
100
11
Run Code Online (Sandbox Code Playgroud)
编译器允许放置一个const合格的变量在只读存储器中,但它不具有以(二话不说,有些环境不执行任何这样的事情).特别是,将自动("本地")变量置于只读存储器中几乎总是不切实际的.
如果您将声明更改i为:
static const int i = 11;
Run Code Online (Sandbox Code Playgroud)
然后你可能会发现程序现在在运行时崩溃了.