堆栈上的 Const C 字符串
Const C-String on Stack?
#include <iostream>
int main() {
const char* s = nullptr;
{
s = "inner";
}
std::cout << s << std::endl;
return 0;
}
内存中的"内部"存储在哪里?
瓦尔格林德没有抱怨。 它是否存储在数据细分受众群中?
谢谢。
根据C++标准
8 普通字符串文字和 UTF-8 字符串文字也被引用 作为窄字符串文字。窄字符串文本的类型为"数组" 的 n 常量字符",其中 n 是下面定义的字符串的大小, 并具有静态存储持续时间 (3.7)。
因此,尽管您的 porgram 中的字符串文字用于 main 的内部块
{
s = "inner";
}
在程序完成执行并且进程的所有内存将被释放之前,它一直处于活动状态。
通常,字符串文本放置在只读数据段中。
它类似于:
static const char t[] = "inner";
s = t;
因此,请参阅实现的文档,了解它如何处理static const
数据。在某些实现中,这是.text
或.rodata
。某些实现可能会将字符串文本存储在与其他静态 const 数据不同的区域中。
瓦尔格林德没有抱怨。
这是因为您的代码没有任何问题:s
仍然在范围内。将常量值分配给s
的位置周围的大括号对程序的流没有影响,因为它们不包含声明。
内存中的"内部"存储在哪里?
答案取决于平台。它通常与程序的代码一起存储,但在某些平台上,字符串常量必须在使用之前复制到不同的内存块中(例如,在使用哈佛架构的硬件上,它将程序和数据保存在单独的地址空间中)。
在任何情况下,分配给字符串文本的内存在程序结束之前都不会被回收。
你可以尝试一个简单的测试:尝试一些strcpy
写入常量字符串内存。
很可能你在 Linux 上会遇到分段错误。
因此,可以肯定的是,它不位于堆栈上,也不位于数据段上。剩下的是代码段或其他只读段,这是显而易见的答案。
如果您想确定,请通过向 GCC 提供链接标志来生成映射文件,如下所示:
-Wl,-Map=output.map
在那里,您可以准确看到常量字符串的存储位置。