![]() |
1
116
一种常见的技术是将字符串文本放入“只读数据”部分,该部分以只读方式映射到进程空间(这就是您不能更改它的原因)。 它确实因平台而异。例如,较简单的芯片架构可能不支持只读内存段,因此数据段是可写的。 相反,尝试找出一个使字符串文本可更改的技巧(它将高度依赖于您的平台,并可能随着时间而更改),只需使用数组:
编译器将安排从文本初始化数组,您可以修改数组。 |
![]() |
2
47
对此没有任何答案。C和C++标准只是说字符串文本具有静态存储持续时间,任何修改它们的尝试都会给出未定义的行为,并且具有相同内容的多个字符串文字可能共享或可能不共享相同的存储。 根据您正在为其编写的系统以及它使用的可执行文件格式的功能,它们可能与程序代码一起存储在文本段中,或者它们可能具有用于初始化数据的单独段。 根据平台的不同,确定细节也会有所不同——最有可能的是包括可以告诉您将其放置在何处的工具。如果您需要的话,有些甚至可以让您控制这样的细节(例如,gnu ld允许您提供一个脚本来告诉它如何对数据、代码等进行分组)。 |
![]() |
3
38
为什么我不尝试改变它? 因为它是未定义的行为。引述自 C99 N1256 draft 6.7.8/32“初始化” :
他们去哪里? GCC 4.8 x86-64 ELF Ubuntu 14.04:
程序:
编译和反编译:
输出包含:
所以字符串存储在
然后:
包含(简化):
这意味着默认链接器脚本会同时转储
如果我们为
我们获得:
所以它被存储在堆栈中(相对于
|
![]() |
4
21
仅供参考,只需备份其他答案: 标准: ISO/IEC 14882:2003 说:
|
![]() |
5
13
GCC作出
Visual C++
您可以查看
例如。
|
![]() |
6
4
这取决于 format 您的 executable . 考虑到这一点的一种方法是,如果您正在进行汇编编程,那么您可以将字符串文本放入汇编程序的数据段中。您的C编译器执行类似的操作,但这完全取决于您的二进制文件是为哪个系统编译的。 |
![]() |
7
2
字符串文本经常分配给只读内存,使其不可变。但是,在某些编译器中,修改是可以通过“智能技巧”实现的,而智能技巧是通过“使用指向内存的字符指针”实现的。记住,有些编译器可能不允许这样做。下面是演示
|
![]() |
8
0
由于这可能不同于编译器,因此最好的方法是筛选搜索字符串文字的对象转储:
哪里
在Windows计算机上使用gcc,并在
正在运行
退货
|
![]() |
Community wiki · C中有哪些耗时的操作? 1 年前 |
![]() |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
![]() |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
![]() |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |