以下示例在我的理解中增加了混乱.我无法理解如何修改const变量local.请帮我理解一下.
/* Compile code without optimization option */
// volatile.c
#include <stdio.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
$ gcc volatile.c -o volatile -save-temps
$ ./volatile
本地的初始值:10
修改后的本地值:100
如果我们查看C99草案标准部分类型限定符第4段,它就是未定义的行为,它说:6.7.3
如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为是未定义的.如果尝试通过使用具有非volatile限定类型的左值来引用使用volatile限定类型定义的对象,则行为未定义.115)
所以你对结果没有任何期望,你不应该这样做.
如果我们看第2段,它说:
与限定类型关联的属性仅对作为左值的表达式有意义.114)
和脚注114说:
该实现可以在只读存储区域中放置一个非易失性的const对象.此外,如果从不使用其地址,则实现不需要为这样的对象分配存储.
一般来说,实现不必将const变量设置为只读,但它可能会因为R ..指出将自动变量放在只读存储器中会很困难.