使用指针写入常量变量会导致运行时错误。
const int i;
int *p;
void main()
{
p = (int*)&i;
*p = 10; // Causes runtime error
}
但是在windows系统中,一切都是由RAM本身运行的。
当我打印const变量和普通变量的地址时,我可以看到它们在不同的偏移量。
系统如何知道指针访问的地址是const
地址?
严格来说,根据c语言标准,您的代码会产生未定义的行为。
实际上,链接器可能将变量i
放在可执行映像的RO部分中。
所以写操作*p = 10
导致内存访问冲突(又名分段错误)。
理想情况下,系统不需要知道。对于具有系统如何知道....
const
限定类型的对象,分配(通常)将位于只读区,因此任何修改(写)的尝试都会导致访问冲突。程序员才应该知道。
当我打印
const
变量和正常变量的地址时,我可以看到它们在不同的偏移量
是的,这很可能,因为普通变量驻留在读写内存中,而const
变量驻留在只读内存中。
请注意,你的代码片段没有语法(或编译)错误。只有代码(运行时)的行为是未定义的。
供参考,引用C11
, chapter§6.7.3/p6
如果试图通过use修改用const限定类型定义的对象对于非const限定类型的左值,其行为是未定义的。[…]