c_str的奇怪行为?
Strange behavior of c_str?
本文关键字:str 更新时间:2023-10-16
我有一个下面的代码片段。我预计输出会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
的内存块的地址,从这里开始s1
和s2
独立开始。
(二( 但是当我分配s1 = "Hi there ..... "
时,我在(1(中的想法被证明是错误的。不知何故,s1
仍然在影响s2
.
(三( 当我注释掉s1 = "Hi there .... "
行时,一切正常,即mystring
打印一致。
(四( 我真的不相信我在 (1( 中的说法,即c_str
正在分配内存来容纳s1
,因为如果是这种情况,我们将不得不通过指针处理释放内存块s2
而我们没有这样做。所以我不确定。
请帮我解释这种奇怪的行为。
引用 cpp 首选项:
从
c_str()
获得的指针可能因以下原因而失效:
- 在字符串上调用非常量成员函数,不包括运算符 []、at((、front((、back((、begin((、rbegin((、end(( 和 伦德((。
通过修改字符串,您将不再具有有效的指针。
另外,你的前提也是错误的。未分配内存/空闲 w.r.t.c_str
.c_str
和data
(在 C++11 中完全相同(返回指向基础存储的指针。它不拥有存储。当存储因任何原因更改时,您的指针不再有效(即,它现在可能指向垃圾(。
s1.c_str()
不返回独立于s1
的内存。对s1
所做的更改会使s1.c_str()
返回的指针失效。
换句话说,小心使用c_str
.通常使用它来将 C 字符串传递给不接受C++字符串的函数。
相关文章:
- 没有找到相关文章