在C中,可以通过指针修改const变量吗?

Adi*_*Adi 4 c pointers const

我在代码中写了一些类似的东西

const int x=1;
int *ptr;
ptr = &x;
*ptr = 2;
Run Code Online (Sandbox Code Playgroud)

这适用于所有编译器吗?为什么GCC编译器没有注意到我们正在改变一个常量变量?

Kei*_*son 9

const实际上并不意味着"不变".C中"常量"的东西具有在编译时确定的值; 文字42就是一个例子.该const关键字实际上意味着只读.例如,考虑一下:

const int r = rand();
Run Code Online (Sandbox Code Playgroud)

r程序执行时间之前不确定值,但const关键字表示r在初始化之后不允许修改.

在你的代码中:

const int x=1;
int *ptr;
ptr = &x;
*ptr = 2;
Run Code Online (Sandbox Code Playgroud)

赋值ptr = &x;是一种约束违反,这意味着一个符合要求的编译器需要对它进行投诉; 您不能合法地将const int*(指向const int的指针)值分配给非const int*对象.如果编译器生成可执行文件(它不需要执行;它可能只是拒绝它),那么行为不是由C标准定义的.

例如,生成的代码可能实际存储值2x-但是以后的参考x可能会产生价值1,因为编译器知道那个x不能被初始化后修改.它知道,因为你这么说,通过定义xconst.如果你撒谎到编译器,后果可能是任意的坏.

实际上,可能发生的最糟糕的事情是程序的行为与您期望的一样; 这意味着您有一个很难检测到的错误.(但你应该得到的诊断将是一个很大的线索.)