我有一个由[1,2,3,4,5,。,..]等字符组成的数组,我有一个看起来像
的循环 for (size_t i = 0; i < size; ++i)
os << data[i]; // os is std::ostream&
此循环以正确的顺序打印数组,没有任何错误。但是当我使用这个循环向后打印时
for (size_t i = (size - 1); i >= 0; --i)
os << data[i];
我收到了分段错误错误。有什么理由可以发生这种情况吗?
答案 0 :(得分:2)
条件i >= 0
始终为真(因为size_t
是无符号类型)。你已经写了一个无限循环。
你的编译器没有警告过你吗?我知道g++ -Wextra
在这里做了。
你可以做的是:
for (size_t i = size; i--; ) {
os << data[i];
}
这使用后递减来检查i
的旧值,这允许循环在i = 0
之后停止(此时i
已绕到SIZE_MAX
{1}})。
答案 1 :(得分:2)
size_t
是无符号整数,所以它总是保持正数,所以你的循环是一个无限循环
答案 2 :(得分:2)
您可以使用C ++ for-in循环来避免此问题。例如:
#include <iostream>
#include <vector>
#include <boost/range/adaptor/reversed.hpp>
using std::vector;
using std::cout;
using boost::adaptors::reverse;
int main()
{
auto v = vector<char>{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'X' };
char const* sep = "";
for (auto c : v)
{
cout << sep << c;
sep = " ";
}
cout << "\n";
sep = "";
for (auto c : reverse(v))
{
cout << sep << c;
sep = " ";
}
cout << "\n";
}