C++ C++;通过引用递归函数传递字符串或流对象时出现SEGFULT

C++ C++;通过引用递归函数传递字符串或流对象时出现SEGFULT,c++,recursion,segmentation-fault,tail-recursion,C++,Recursion,Segmentation Fault,Tail Recursion,我正试图将我的哈夫曼树序列化为一个文件,但问题的递归性质存在问题。使用cout将其打印到控制台并没有问题,但当我试图将其存储在字符串中或写入文件时,会出现分段错误 string putData(Node *n, string &s) { if (n->leaf()) { s << "[" << n->value() << "]"; } else { s << "."; } if (n->

我正试图将我的哈夫曼树序列化为一个文件,但问题的递归性质存在问题。使用cout将其打印到控制台并没有问题,但当我试图将其存储在字符串中或写入文件时,会出现分段错误

string putData(Node *n, string &s) {

  if (n->leaf()) {
    s << "[" << n->value() << "]";
  } else {
    s << ".";
  }

  if (n->left())
    putData(n->left(), s);

  if (n->right())
    putData(n->right(), s);

}
string putData(节点*n,字符串&s){
如果(n->leaf()){
s right())
putData(n->right(),s);
}
ofstream对象也有同样的问题。事实上,在程序出现故障后,我会检查文件及其内容是否正确。但为什么最后会出现故障?如何阻止程序出现故障

string putData(Node *n, ofstream &s) {

  s.open("huffout.txt", ios::app);

  if (n->leaf()) {
    s << "[" << n->value() << "]";
  } else {
    s << ".";
  }
  s.close()
  if (n->left())
    putData(n->left(), s);

  if (n->right())
    putData(n->right(), s);

}
string putData(节点*n,流&s){
s、 打开(“huffout.txt”,ios::app);
如果(n->leaf()){
s right())
putData(n->right(),s);
}

您的函数被声明为返回
string
,但如果有任何内容查看可能导致segfault的返回值,则该函数没有返回语句。您的编译器应该警告您缺少返回,您不是在编译时发出警告吗


此外,第一个代码示例使用了
字符串
,但尝试使用
运算符对其进行追加如果有任何内容查看返回值可能导致segfault,则您的函数声明为返回
字符串
,但没有返回语句。您的编译器应该警告您缺少返回,您是不是用警告


另外,第一个代码示例使用了
字符串
,但尝试使用
运算符附加到它上。您如何将
流&
传递给使用
字符串&
的对象?您可能需要自己投入更多的精力来调试它。您是否确定了程序崩溃的具体行?是否使用了gdb在这一点上检查变量?你能发布一个最简单的完整程序来展示问题吗?如果你通过回答这些问题的过程,你可能会自己找到解决方案。你是如何将一个
流和
传递给一个
字符串和
的东西的?你可能需要投入更多的精力F请自己调试。您是否确定了程序在哪一行崩溃?您是否使用gdb在那一点上检查了变量?您是否可以发布显示问题的最简单完整程序?如果您通过回答这些问题的过程,您可能会自己找到解决方案。这令人惊讶任何人都会错过那个返回类型。所以,永远不会忘记帮助我愚弄自己。谢谢!@user1479360,有编译器警告。打开它们。令人惊讶的是,任何人都会错过那个返回类型。所以永远不会忘记帮我愚弄自己。谢谢!@user1479360,有编译器警告。打开它们。