字符串文字:它们去哪里了?

字符串文字:它们去哪里了?

我感兴趣的是字符串文本的分配/存储位置。

我确实找到了一个有趣的答案这里,说:

定义一个字符串内联实际上嵌入了程序本身的数据,并且不能被更改(一些编译器通过一个聪明的技巧允许这样做,不要费心)。

但是,它与C+有关,更不用说它说不用麻烦了。

我在烦你。=D

所以我的问题是我的字符串文字在哪里以及如何保存?我为什么不试着改变它呢?实现是否因平台而异?有人愿意详细介绍一下“聪明的把戏”吗?


慕妹3242003
浏览 500回答 4
4回答

qq_笑_17

一种常见的技术是将字符串文本放入“只读数据”部分,将其映射到进程空间作为只读(这就是为什么不能更改它)。它确实因平台而异。例如,简单的芯片结构可能不支持只读内存段,因此数据段将是可写的。相反,尝试找出一个使字符串文本可更改的技巧(它将高度依赖于您的平台,并可能随着时间的推移而改变),只需使用数组:char foo[] = "...";编译器将安排从文字初始化数组,您可以修改数组。

牧羊人nacy

这个问题没有一个答案。C和C+标准只是说字符串文本具有静态存储时间,任何修改字符串的尝试都会产生未定义的行为,具有相同内容的多个字符串文本可能共享也可能不共享相同的存储。根据您正在为之编写的系统以及它使用的可执行文件格式的功能,它们可能与程序代码一起存储在文本段中,或者它们可能有一个单独的段用于初始化数据。根据平台的不同,确定细节也会有所不同-很可能包括可以告诉你它放在哪里的工具。有些人甚至会让你控制这样的细节,如果你想要的话(例如,gnu ld允许你提供一个脚本来告诉它如何对数据、代码等进行分组)。

达令说

FYI,只是备份其他答案:标准:ISO/IEC 14882:2003说:2.13.字符串文字[.]普通字符串的类型为“数组”n const char“和静态储存时间(3.7)是否所有字符串文本都是不同的(也就是说,存储在不重叠的对象中)是实现定义的。试图修改字符串文字的效果未定义。
打开App,查看更多内容
随时随地看视频慕课网APP