关于使用指针修改const变量的困惑

以下示例在我的理解中增加了混淆。 我无法理解如何修改const变量local。 请帮我理解一下。

/* Compile code without optimization option */ // volatile.c #include  int main(void) { const int local = 10; int *ptr = (int*) &local; printf("Initial value of local : %d \n", local); *ptr = 100; printf("Modified value of local: %d \n", local); return 0; } 

$ gcc volatile.c -o volatile -save-temps

$ ./volatile

本地的初始值:10

修改后的本地值:100

如果我们查看C99标准草案第6.7.3类型限定符4段,这只是未定义的行为 ,它说:

如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为未定义。 如果尝试通过使用具有非volatile限定类型的左值来引用使用volatile限定类型定义的对象,则行为未定义。 115)

所以你对结果没有任何期望,你不应该这样做。

如果我们看第2段,它说:

与限定类型关联的属性仅对作为左值的表达式有意义。 114)

和脚注114说:

该实现可以在只读存储区域中放置一个非易失性的const对象。 此外,如果从不使用其地址,则实现不需要为这样的对象分配存储。

一般来说,实现不必将const变量设置为只读,但它可能会因为R ..指出将自动变量放在只读存储器中会很困难。

这是可能的,因为ptr指向int ,而不是const int ,因此,您可以写入ptr包含的内存地址。 真的,没有什么比这更重要了。

const实际上并没有将内存位置标记为只读; 它是否真正是只读的并不是由语言标准真正定义的。 它通常不是(正如你已经发现的那样)。但是,仍然不应该写它。