【问题标题】:Is word used for storing string literal constant pool of memory and ROM both are same用于存储字符串字面量常量内存池和ROM的字是否相同
【发布时间】:2014-02-27 11:35:56
【问题描述】:

我正在阅读 Head First C 书,我在其中阅读我们无法更改字符串文字,因为它存储在只读内存的常量内存池中。所以朋友们,这个恒定的内存池和系统的 ROM 都是一回事。或者在 ROM 以外的内存中还有另一个常量内存池。如果我声明一个字符串,它将存储在 ROM 中,而如果我声明一个 int 或其他任何内容,它将进入 RAM?这是真的吗

【问题讨论】:

  • 您需要澄清您是在谈论通用计算机(可能有硬盘)还是嵌入式系统(程序必须存储在非易失性存储器中)。
  • 这里可以找到很好的解释:stackoverflow.com/questions/2482255/…

标签: c string string-literals


【解决方案1】:

不,它们肯定不是一回事。

不要求字符串存储在ROM中;如果是这种情况,那么您将如何将程序从硬盘加载到 RAM 中并运行它?您不能“加载到 ROM”,因为 ROM 不可写。

对于典型的现代 PC 级计算机,这意味着字符串文字被加载到 RAM 的一部分中,该部分在加载完成后只读

当然,对于嵌入式系统,它可以也意味着字符串文字可以有效地放置在实际的只读存储器(闪存或正版 ROM)中,因为无法有效地修改数据。这对于嵌入式系统来说很方便,因为“代码空间”(闪存或 ROM)的数量通常远大于可用 RAM 的数量。

总而言之,这是一个相当通用的规范:它只是说从程序的角度来看,字符串文字被认为是不可修改的。它没有说 如何 是实现的。文字完全有可能是可修改的,即没有任何形式的防止尝试的保护。这并不意味着它突然变得有效,只是实施并不能保护您免受自己的侵害。

【讨论】:

  • 此内存只能在现代处理器架构上设置为只读,并在硬件中实现了高级内存管理。因此,例如在旧的 8 位和 16 位系统中,这通常是不可能的。
【解决方案2】:

不,它们没有存储在 ROM 中,实际上它们以只读方式映射到进程空间。还要提到它取决于平台并因平台而异。

但是,如果您要修改字符串,那么最好使用数组,因为编译器会安排数组从字面量初始化,您可以修改数组。

【讨论】:

    【解决方案3】:

    NO 不是硬件 ROM,字符串文字仅存储在 RAM 中的只读扇区(在进程空间内),但一些更简单的芯片架构可能不支持只读段,在这些情况下它是可编辑的。

    注意:阅读有关进程空间(文本、数据、堆栈)的信息,您将了解更多信息Check Here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-24
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 2012-12-18
      • 1970-01-01
      相关资源
      最近更新 更多