堆栈上的Const C-String?

时间:2015-04-14 12:33:42

标签: c++

#include <iostream>

int main() {
    const char* s = nullptr;
    {
        s = "inner";
    }
    std::cout << s << std::endl;
    return 0;
}

&#34;内部&#34;存储在内存中?

Valgrind并不抱怨。它存储在数据段中吗?

感谢。

4 个答案:

答案 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字符串内存。

很可能你在Linux上有分段错误。

因此,确保它不会位于堆栈上,也不会位于数据段上。 剩下的是代码段或其他只读段,这是明显的答案。

如果您想确切知道,请通过向gcc提供链接标志来生成地图文件,如下所示:

-Wl,-Map=output.map

在那里你可以看到const字符串存储的确切位置。