为什么这段代码可以改变常量整数?

时间:2017-07-15 13:32:51

标签: c

int const i = 10;
int *j = &i;
*j = 20;
printf("%d",i);

如果我是常数,不应该通过指针改变它。如果不是它不改变的条件是什么?

2 个答案:

答案 0 :(得分:3)

编译器应该为此行发出警告:int *j = &i;。您将非const限定指针指向const限定对象。

稍后尝试通过i指针修改j时,行为未定义:

  • 如果i可写,则可能会被修改,这就是您所观察到的内容。
  • 但如果您在文件范围内定义i,编译器可能会将其定位在只读段中,并且尝试可能会因分段错误而失败。
  • 其他任何事情都可能发生,包括总统崩溃。

尝试编译并运行此程序:

#include <stdio.h>

int const i = 10;

int main(void) {
    int *j = &i;
    *j = 10;
    printf("%d\n", i);
    return 0;
}

答案 1 :(得分:2)

You can change a const variable but the behavior is undefined

您的编译器应警告以下行中const的丢失,

int *j = &i;

所以const的工作方式与此完全相同,它只会阻止您意外更改const变量,因为您在使用之前会听取编译器并修复代码。

但是,您无法直接分配到i

但是通过指针你可以随时摆脱const。在你摆脱const之前你应该知道是否定义了结果行为,这有时候很好,但是如果你必须这样做,那么可能意味着你有设计问题。