c - 用于存储字符串文字常量池的内存和ROM的word是一样的吗

标签 c string string-literals

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

最佳答案

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

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

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

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

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

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

相关文章:

c - Ruby的排序是如何实现的?

c# - 如何对视频进行编码?

string - C++/CLI 从 System::String^ 转换为 std::string

c++ - 为什么我们在C++字符串中需要一个空终止符?

c - 文字中的非 ASCII、非 Unicode 字符

ios - 有什么方法可以在没有循环的情况下检查指向指针的 bool** 指针是否包含 C 中的真值?

c - 嵌入式系统(c 代码)中使用的 tdf 文件是什么?

比较字符串数组中的特定字符串

c - argv是怎么填的?

c++:从模板参数生成字符串文字