通常,内存可以是可读写的。当C编译器设置内存const时,它的机制是什么?谁阻止正在写入的内存。如果错误强制写入标记的const内存,谁报告段错误?
答案 0 :(得分:2)
C11标准中只有没有指定机制用于只读内存。通过阅读n1570进行检查。但请scared为undefined behavior(例如,写一些const
数据)。
实际上,在当前operating systems上运行的许多C实现(例如Linux,Windows,Android,MacOSX,...)以及具有x86-64或{{3的桌面,平板电脑或服务器处理器,ARM有一些process,有各种段,有些只读(并且在virtual address space的帮助下由操作系统kernel管理)。另请阅读MMU& virtual memory。花几天时间阅读像segmentation fault这样的书(可免费下载)。
在嵌入式Operating Systems: Three Easy Pieces上(例如microcontrollers),某些内存可能是硬件Arduino。一些编译器可能(但不是必须!)将它用于一些常量数据。
您可以使用ROM(使用GNU ld
)将一些只读段组织到只读内存中。这是非常具体的实现。
但是,某些平台没有任何用户可编程的只读内存(例如,某些linker scripts的工厂ROM包含embedded systems中的固定boot loader,以及所有内容其他是在RAM)。 YMMV。
答案 1 :(得分:2)
将虚拟内存的页标记为可读,可写或可执行(或所有内容的组合)的操作系统。
编译器和链接器协同工作以标记可执行文件的特殊部分,然后操作系统加载器处理设置内存本身。
这一切都不是C标准的一部分,它只指定尝试修改const
变量是未定义的行为。
答案 2 :(得分:-1)
编译器和链接器实现它,例如在嵌入式系统中,RAM上的数据是可更改的,而Flash / ROM上的数据是不可更改的。
因此,如果数据是用const定义的,那么它将放置在非易失性存储位置,例如闪存/ ROM,磁盘。
使用const定义变量有两个好处: - 避免此变量因编码错误而改变。(编译器错误) - 减少RAM使用量,例如应将长文本放入Flash / ROM或磁盘中。