Const变量在C中用指针改变

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)

SLa*_*aks 8

const是一个编译时功能.
它不会阻止你在脚下射击自己; 这是警告的内容.

  • `const`不一定只是一个编译时功能.在我的环境中,如果我在上面的例子`static`中创建变量`i`,那么程序在运行时崩溃. (4认同)
  • @Martin Beckett:单独`static`不允许编译器将它放在只读内存中 - 原则上它只是`const`允许这样做,但实际上`const`必须与`static`组合才能实现这个效果因为对自动变量这样做是不切实际的.`const`单独的变量可以在其使用点由文字替换,甚至是自动变量. (3认同)

caf*_*caf 8

const不是对编译器的请求,使其无法更改该变量.相反,它是对编译器的承诺,你不会.如果你违背诺言,你的程序可以做任何事情,包括崩溃.

例如,如果我使用具有-O2优化级别的gcc编译示例代码,则输出为:

100
11
Run Code Online (Sandbox Code Playgroud)

编译器允许放置一个const合格的变量在只读存储器中,但它不具有以(二话不说,有些环境不执行任何这样的事情).特别是,将自动("本地")变量置于只读存储器中几乎总是不切实际的.

如果您将声明更改i为:

static const int i = 11;
Run Code Online (Sandbox Code Playgroud)

然后你可能会发现程序现在在运行时崩溃了.