gpt4 book ai didi

c++ - c_str 的奇怪行为?

转载 作者:太空狗 更新时间:2023-10-29 19:38:27 31 4
gpt4 key购买 nike

我有下面的代码片段。我期待输出将是 mystring,但奇怪的是它输出垃圾字符。

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {
string s1("mystring");

const char* s2 = s1.c_str();

s1 = "Hi there, this is a changed string s1";

cout << s2 << endl;

return 0;
}

(1)我最初的想法是 c_str 负责分配足够的内存保存 s1 并返回分配给 s2 的内存块的地址,从这里开始 s1s2 独立开始。

(2)但是当我分配 s1 = "Hi there ..... " 时,我在 (1) 中的想法被证明是错误的。不知何故,s1 仍在影响 s2

(3)当我注释掉 s1 = "Hi there .... " 行时,一切正常,即 mystring 得到一致打印。

(4)我不太相信我在 (1) 中关于 c_str 正在分配内存来保存 s1 的说法,因为如果是这种情况,我们将不得不处理释放该内存块的问题通过我们不做的 s2 指针。所以我不确定。

请帮我解释一下这个奇怪的行为。

最佳答案

引用 cppreference :

The pointer obtained from c_str() may be invalidated by:

  • Calling non-const member functions on the string, excluding operator[], at(), front(), back(), begin(), rbegin(), end() and rend().

通过修改字符串,您不再拥有有效的指针。

另外,你的前提是错误的。没有分配/释放内存 w.r.t. c_strc_strdata(在 C++11 中相同)返回指向底层存储的指针。它不拥有存储空间。无论出于何种原因更改存储时,您的指针将不再有效(即,它现在可能指向垃圾)。

关于c++ - c_str 的奇怪行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51893685/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com