C++ memcpy的结果(“x[0],“fsd”,3) 字符串x; 78倍储备(100); 79 x[0]=“1”; 80 x[1]=“2”; 81 x[2]='\0'; 82 x(3); 83 cout

C++ memcpy的结果(“x[0],“fsd”,3) 字符串x; 78倍储备(100); 79 x[0]=“1”; 80 x[1]=“2”; 81 x[2]='\0'; 82 x(3); 83 cout,c++,C++,std::string不一定将其数据存储为C字符串,即附加\0。相反,字符串的长度在内部保持不变。如果您更改了内容,这很好,但是resize()不知道有实际数据,因为从string的角度看,长度仍然是0。引述: 如果n大于字符串的当前长度,则会根据需要添加尽可能多的c字符实例来扩展内容,以达到n个字符的大小 此调用中的c字符是\0,因此resize()实际上会将字符串更改回空字符串 这是正确的行为,因为不支持以这种方式直接修改std::string的内容。使用运算符[],追加等等。std::st

std::string
不一定将其数据存储为C字符串,即附加
\0
。相反,字符串的长度在内部保持不变。如果您更改了内容,这很好,但是
resize()
不知道有实际数据,因为从
string
的角度看,长度仍然是0。引述:

如果n大于字符串的当前长度,则会根据需要添加尽可能多的c字符实例来扩展内容,以达到n个字符的大小

此调用中的
c
字符是\0,因此
resize()
实际上会将字符串更改回空字符串


这是正确的行为,因为不支持以这种方式直接修改
std::string
的内容。使用
运算符[]
追加
等等。

std::string
不一定将其数据存储为C字符串,即追加了
\0
。相反,字符串的长度在内部保持不变。如果您更改了内容,这很好,但是
resize()
不知道有实际数据,因为从
string
的角度看,长度仍然是0。引述:

如果n大于字符串的当前长度,则会根据需要添加尽可能多的c字符实例来扩展内容,以达到n个字符的大小

此调用中的
c
字符是\0,因此
resize()
实际上会将字符串更改回空字符串


这是正确的行为,因为不支持以这种方式直接修改
std::string
的内容。使用
操作符[]
附加
等等。

你应该花点时间确保你确实提出了一个问题,同时保持标题和问题的同步。至于什么可能让您困惑(您的代码让我困惑),
std::string::resize()
将用“\0”填充创建的新元素,覆盖您以前的编辑。将
resize()
移动到作业上,您会没事的。

您应该花点时间确保您确实提出了一个问题,同时保持标题和问题的同步。至于什么可能让您困惑(您的代码让我困惑),
std::string::resize()
将用“\0”填充创建的新元素,覆盖您以前的编辑。将
resize()
移动到作业上,您就会没事了

        string x;
 78     x.reserve(100);
 79     x[0] = '1';
 80     x[1] = '2';
 81     x[2] = '\0';
 82     x.resize(3);
 83     cout << "sdfs: " << x.c_str() << endl;
 84     cout << &x[0] << endl;
 85     return 0
这只是为字符串保留内存。这意味着现在您可以向字符串追加100个字符,而无需重新分配字符串内存

这不会更改字符串的大小
x
仍然是一个空字符串

这是对索引的越界访问(如果实现不提供运行时检查,您可以不受限制,因为您已经保留了内存)

这将生成一个有效字符串,长度为3个字符,每个字符具有默认值(
'\0'

这只是为字符串保留内存。这意味着现在您可以向字符串追加100个字符,而无需重新分配字符串内存

这不会更改字符串的大小
x
仍然是一个空字符串

这是对索引的越界访问(如果实现不提供运行时检查,您可以不受限制,因为您已经保留了内存)


这将生成一个有效字符串,长度为3个字符,每个字符都具有默认值(
'\0'
)。

文章的标题和文本不同步。文章的标题和文本不同步。此答案比问题(如果有)更令人困惑。此答案比问题(如果有)更令人困惑。
 78     x.reserve(100);
 79     x[0] = '1';
 80     x[1] = '2';
 81     x[2] = '\0';
82     x.resize(3);