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

最佳答案

不,它们当然不是一回事。

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

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

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

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

关于c - 内存和ROM用于存储字符串常量池的字是一样的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22067304/

10-11 19:34