【发布时间】:2017-11-02 12:52:44
【问题描述】:
#include <string>
#include <iostream>
using namespace std;
const string& strReverse(const string&);
int main() {
cout << strReverse("POT") << endl;
}
const string& strReverse(const string& s) {
static string ret;
ret = "";
for(string::size_type i = s.length()-1; i >= 0; --i) {
ret += s[i];
}
return ret;
}
上面的代码会导致程序在运行时崩溃。但是,如果我将i 的类型更改为int,它就可以工作。
这是为什么呢?我认为使用string::size_type 比使用特定类型(例如int)“更安全”。使用auto 也会导致程序崩溃。
我认为可能string::size_type 中的类型与数组索引不兼容,因此我尝试将索引i 转换为int,但这也不起作用。
【问题讨论】:
-
也许 size_type 是无符号的,你从无符号中减去 0-1,这是一个巨大的正数,然后你访问了一堆越界内存
-
避免此问题的最佳方法是使用迭代器而不是索引,尤其是反向迭代器。更好的是,还有 std::reverse。
-
除了从概念上考虑之外,简单地使用调试器甚至简单地添加一些诊断打印就可以为您回答这个问题。
-
为什么是
retstatic?你认为这有什么好处? -
所以,另一个似乎坚持学生必须无缘无故做奇怪事情的练习。我很高兴我自学了。