堆栈上的 Const C 字符串

Const C-String on Stack?

本文关键字:字符串 Const 堆栈      更新时间:2023-10-16
#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

在那里,您可以准确看到常量字符串的存储位置。

相关文章: