1

在我正在编写的程序中,某个代码块只有在我cout << endl在它的开头有一个语句时才能正常工作。如果不存在,则程序不会出现段错误,而只是在 100% 的情况下给出可验证的错误答案。有了这个cout << endl声明,它每次都有效。我实际上不知道是什么原因造成的,因为我尝试使用刷新 cout 缓冲区cout.flush()但没有效果。cout此外,没有 endl也无法使用。我还仔细检查了,该结构的所有成员变量Node都已在该结构的初始化列表中初始化。如果有人可以帮助我,我将不胜感激!这是有问题的代码:

`    bool Board::CheckDistinct(Node* node, int* rec) {
      cout << endl; // if I comment this line out, it doesn't work correctly
      if(node->incoming.size() > 1) {
        Node* rec_node = node->incoming[rand() % node->incoming.size()];
        *rec = rec_node->row * num_cols() + rec_node->col;
        return false;
      }
      else if(node->incoming.size() == 0) return true;
      else {
        node->visited = true;
        if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);
      }
    }

这是Node结构的代码(如果有帮助):

   struct Node {
      int val, row, col, dist;
      bool visited, is_white_hole, is_black_hole;
      Node* outgoing[4];
      std::vector<Node*> incoming;
      Node(int val_, int row_, int col_) :
      val(val_), row(row_), col(col_), dist(-1),
      visited(false),
      is_white_hole(true), is_black_hole(true) { }
  };
4

2 回答 2

3

我怀疑问题在于您没有返回内部结果:

    if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);

应该:

    if(!node->incoming[0]->visited) return CheckDistinct(node->incoming[0], rec);
                                    ^^^^^^

cout调用可能只是以某种方式改变代码生成(例如,编译器可能决定实际递归而不是将尾递归转换为循环,或以某种方式使用不同的寄存器,或一长串其他事情。

(需要注意的是,这个错误我见过很多次,自己也犯过几次……一点都不稀奇!)

于 2014-10-27T09:04:16.980 回答
0

好的,我终于找到了。错误出现在 return 语句中:

if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);

如果这不是真的,我没有 else 语句会返回,所以我猜此时发生了未定义的行为。我仍然不知道为什么要cout << endl解决这个问题,但我想就是这样。

于 2014-10-27T09:21:44.497 回答