memcpy的结果(& x [0],“fsd”,3)

时间:2010-09-02 08:12:21

标签: c++

        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

测试结果:什么都不打印

3 个答案:

答案 0 :(得分:2)

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

  

如果n大于字符串的当前长度,则通过附加所需的c字符实例来扩展内容,以达到n个字符的大小。

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

这是正确的行为,因为不支持以这种方式直接修改std::string的内容。请改用operator[]append等等。

答案 1 :(得分:2)

 78     x.reserve(100);

这只是为字符串保留内存。这意味着现在您可以在字符串中附加100个字符,而字符串不必重新分配内存。

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

 79     x[0] = '1';
 80     x[1] = '2';
 81     x[2] = '\0';

这是访问索引越界(如果实现没有提供运行时检查,你可以逃脱,因为你保留了内存)

82     x.resize(3);

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

答案 2 :(得分:1)

您应该花些时间确保实际提出问题,同时保持标题和问题的同步。至于可能令你困惑的是什么(你的代码让我感到困惑),std::string::resize()将填充'\ 0'创建的新元素,覆盖之前的编辑。将resize()移到作业上,你会没事的。