尝试反向打印数组时c ++分段错误

时间:2018-04-14 19:18:50

标签: c++ arrays segmentation-fault

我有一个由[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];

我收到了分段错误错误。有什么理由可以发生这种情况吗?

3 个答案:

答案 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";
}