当您在Windows上运行程序时,它将被加载到计算机内存中,组织为:
数据段可能包含只读或具有读写访问权限的数据。
E.g:
char *c = "Hello World";
字符串Hello World
据说存储在内存的只读部分。它是存储在有时称为RAM的物理存储器中还是存储在只读的ROM中?如果它是只读的,怎么写?
答案 0 :(得分:2)
存储在RAM中。操作系统与处理器本身一起,能够保护内存区域,以便任何从用户代码写入它们的尝试都会导致异常。
答案 1 :(得分:2)
PC只有一个内存区域确实符合ROM的要求,这就是BIOS的存储位置。所有Windows和Windows中加载的程序都将在RAM中。
x86处理器内存管理能够将内存块标记为只读,但链接器和操作系统必须协同工作才能启用此功能。它在程序加载到内存后发生。
答案 2 :(得分:2)
在许多嵌入式系统中,它们具有RAM和某种类型的只读存储器,通常称为闪存(它可以多次编程而无需从印刷电路板上移除)。
简单的嵌入式应用程序将可执行文件和只读数据部分放在Flash中并执行Flash。读/写变量放入RAM。让我们为您的示例代码片段考虑此模型:
char * c = "Hello World!";
在上面的语句中,变量c
存在于RAM中,因为变量的默认设置是&写入权限。如果您指定变量是常量,它将存在于ROM中{实际上,它将表示ROM中的位置。}:在此处输入代码
char * const c = "Hello World!"; // A constant pointer that lives in ROM.
编译器将文字文本"Hello World!"
视为稍微复杂一些。实际文本存在于ROM中,可执行区域或数据区域;取决于翻译。许多编译器将在RAM中分配内存并将文字复制到RAM中,并使变量c
指向RAM中的副本。这是因为文字未指定为常量。
为避免将文字复制到RAM中,请声明指向常量数据的变量:
const char * c = "Hello World"; // A pointer to constant data.
上面的定义仍然允许指针在执行期间指向不同的东西。如果要在整个程序中引用文本文字的一个实例,请声明一个指向常量数据的常量指针:
const * char * const c = "Hello World!"; // A constant pointer to constant data
这种技术允许可执行文件加载到RAM中(以便更快地执行),并且仍然可以从ROM访问只读数据(这可以释放SRAM以获得真正的读/写变量)。
在大多数PC上,一切都存在于非易失性存储器(硬盘驱动器,BIOS等)或RAM中。常用方法是从ROM(包括硬盘驱动器)加载程序并在RAM中执行。将可执行文件加载到RAM中时,OS通常也会将只读数据加载到RAM中。操作系统可以保护只读数据,因此当应用程序写入此区域时会生成异常。
答案 3 :(得分:1)
它存储在RAM中。
使用字符串初始化的字符串指针(如示例中所示)是只读的。 您可以cast a const variable so that you can "write" to it,但程序的行为将无法预测。
RAM的只读区域受操作系统保护。
这可能会因您所使用的系统类型而异。上面的答案将是您的标准PC。嵌入式系统实际上可能会将常量数据写入某种非易失性存储器。
答案 4 :(得分:1)
如果有帮助,请考虑内存有两种不同的只读方式。
当你谈论程序值的只读内存时,你通常会谈论第二种类型。程序启动时初始化值,然后操作系统不允许修改它们。
注意:以上是一个非常简单的解释,但确实提供了一般性的想法。
答案 5 :(得分:-1)
存储在RAM内存中。 ]产品:>