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

时间:2014-01-27 03:46:31

标签: c pointers const

以下示例在我的理解中增加了混乱。我无法理解如何修改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;
}

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

$ ./volatile

本地的初始值:10

修改后的本地值:100

1 个答案:

答案 0 :(得分:6)

如果我们查看C99草案标准部分6.7.3 类型限定符段落 4 ,这只是undefined behavior,它说:

  

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

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

如果我们查看段落 2 ,它会说:

  

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

和脚注114说:

  

实现可能会在只读区域中放置一个非易失性的const对象   存储。此外,如果从未使用过地址,则实现无需为此类对象分配存储空间。

一般情况下,实现不必使 const 变量只读,但它可能会因为R ..指出在只读内存中放置一个自动变量会很难的。