字符串文字将存储在哪里

时间:2019-03-04 13:20:13

标签: c++ string

我使用Visual Studio 2017

int main()
{
    std::string a = "hello";
    std::cout << &a;  
    a[1] = 'r';
    std::cout << &a;  gives same address as above 
    std::cin.get();
}

当我将鼠标指针悬停在“ hello”上时。

它显示const char [6]。因此,“ hello”存储在只读存储器中。

然后怎么可能更改其中的值。

screen shot

3 个答案:

答案 0 :(得分:4)

  

将存储字符串文字的地方

字符串文字具有静态的存储期限。

  

然后怎么可能更改其中的值。

您没有更改字符串文字(这在C ++中是无法完成的)。

您已经创建了std::string类型的对象。 std::string包含(可能)动态分配的缓冲区。您已将字符串文字复制到该动态缓冲区中,并且正在修改字符串文字的副本。

  

但是带有“ hrllo”。它应该为“ hrllo”分配新的内存,对吗?并指向新位置?

不。修改std::string的字符不会导致重新分配。但是,插入字符可能潜在地引起重新分配。

答案 1 :(得分:1)

std::string复制了“ hello”,而您没有复制std::string本身的常量。

答案 2 :(得分:1)

文字"hello"位于可执行文件的只读存储器中,甚至在程序运行之前就已经存在。变量a的构造方式是:

string::string(const char*)

(实际上是std::basic_string

此构造函数将字符从文字复制到新创建的对象。如果字符串较短,则可以将字符直接复制到对象的内存中。否则,分配一个新的存储区,将字符复制到那里,并且对象指向新的块。

新对象从不存储指向原始文字的指针。

编辑

std::cout << &a;

获取类型为a的对象(名为std::basic_string<char>)的地址。该对象位于堆栈上,并在int main()内部创建和销毁。对象不会移动,因此指针是恒定的,并且在字符串更改时不会更改。这与该对象的this方法内的std::basic_string<char>指针相同。