#include <iostream>
int main() {
const char* s = nullptr;
{
s = "inner";
}
std::cout << s << std::endl;
return 0;
}
&#34;内部&#34;存储在内存中?
Valgrind并不抱怨。它存储在数据段中吗?
感谢。
答案 0 :(得分:2)
根据C ++标准
8也引用普通的字符串文字和UTF-8字符串文字 作为窄字符串文字。窄字符串文字的类型为“数组” of n const char“,其中n是下面定义的字符串的大小, 并且具有静态存储持续时间(3.7)。
因此,虽然你的porgram中的字符串文字用于主
的内部块{
s = "inner";
}
它一直存在,直到程序完成执行,并且将释放进程的所有内存。
通常字符串文字放在只读数据段中。
答案 1 :(得分:1)
类似于:
static const char t[] = "inner";
s = t;
因此,请参阅您的实施文档,了解它对static const
数据的作用。在某些实现中,这是.text
或.rodata
。某些实现可能会将字符串文字存储在与其他静态const数据不同的区域中。
答案 2 :(得分:1)
Valgrind并没有抱怨。
这是因为您的代码没有任何问题:s
仍在范围内。为s
指定常量值的地方周围的大括号不会影响程序的流程,因为它们不包含声明。
&#34;内部&#34;存储在内存中?
答案取决于平台。它通常与程序代码一起存储,但是有些平台在使用之前必须将字符串常量复制到不同的内存块中(例如,在使用哈佛架构的硬件上,将程序和数据保存在不同的地址空间中。)
无论如何,在程序结束之前,分配给字符串文字的内存不会被回收。
答案 3 :(得分:1)
您可以尝试一个简单的测试:尝试一些strcpy
来写入const字符串内存。
因此,确保它不会位于堆栈上,也不会位于数据段上。 剩下的是代码段或其他只读段,这是明显的答案。
如果您想确切知道,请通过向gcc提供链接标志来生成地图文件,如下所示:
-Wl,-Map=output.map
在那里你可以看到const字符串存储的确切位置。