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
测试结果:什么都不打印
答案 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()
移到作业上,你会没事的。