以下示例在我的理解中增加了混乱。我无法理解如何修改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
答案 0 :(得分:6)
如果我们查看C99草案标准部分6.7.3
类型限定符段落 4 ,这只是undefined behavior,它说:
如果尝试通过use修改使用const限定类型定义的对象 如果是非const限定类型的左值,则行为未定义。如果是尝试 通过使用左值来引用用volatile限定类型定义的对象 对于非易失性限定类型,行为未定义。 115)
所以你对结果没有任何期望,你不应该这样做。
如果我们查看段落 2 ,它会说:
与限定类型关联的属性仅对表达式有意义 是左值。 114)
和脚注114
说:
实现可能会在只读区域中放置一个非易失性的const对象 存储。此外,如果从未使用过地址,则实现无需为此类对象分配存储空间。
一般情况下,实现不必使 const 变量只读,但它可能会因为R ..指出在只读内存中放置一个自动变量会很难的。