c -系统如何知道被访问的地址是常量还是非常量?



使用指针写入常量变量会导致运行时错误。

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限定类型的左值,其行为是未定义的。[…]

最新更新