我使用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”存储在只读存储器中。
然后怎么可能更改其中的值。
答案 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>
指针相同。