C++ 分段故障(堆芯转储)错误C++;递归调用

C++ 分段故障(堆芯转储)错误C++;递归调用,c++,heap,stack-overflow,heap-memory,C++,Heap,Stack Overflow,Heap Memory,我有一个4个顶点的循环图 每个节点都与一条边相关联,我将其存储在一个名为nodelabel的映射中 我正在尝试调用printAll(intsource,intdepth),它将为我提供从源节点到深度长度的路径(偏移量0到节点大小) 当深度达到650时,运行良好。当我给出printAll(2800)时,它给出了分段错误 我已经调试过,错误来自printAllPathsUtil函数……有人能告诉我发生分段错误的原因吗 Graph g(4); // 4 nodes g.addEdge(0, 1); g

我有一个4个顶点的循环图

每个节点都与一条边相关联,我将其存储在一个名为nodelabel的映射中

我正在尝试调用printAll(intsource,intdepth),它将为我提供从源节点到深度长度的路径(偏移量0到节点大小)

当深度达到650时,运行良好。当我给出printAll(2800)时,它给出了分段错误

我已经调试过,错误来自printAllPathsUtil函数……有人能告诉我发生分段错误的原因吗

Graph g(4); // 4 nodes
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);

g.addLabel(0, "AAGT");
g.addLabel(1, "CCTC");
g.addLabel(2, "TTCC");
g.addLabel(3, "CTC");
map < int, string > nodelabel; // Map containing Nodelabel corresponding to every node id
void Graph::addLabel(int v, string s) {
  nodelabel[v] = s; // Add w to v’s list.
}

void Graph::printAllPaths(int source, int depth) {
  string kmerpath;
  int * path = new int[V];
  int path_index = 0; // Initialize path[] as empty

  // Call the recursive helper function to print all paths
  for (int offset = 0; offset < nodelabel[source].length(); offset++) {
    printAllPathsUtil(source, offset, depth, path, path_index, kmerpath, 1);
    path_index = 0;

  }
}

void Graph::printAllPathsUtil(int u, int offset, int d, int path[], int & path_index, string kmerpath) {
  path[path_index] = u; // store Current node in the path[]
  path_index++;

  if (d == 0) {
    //cout << kmerpath << endl;
  } else if ((nodelabel[u].length() - offset) >= d) {
    kmerpath.append(nodelabel[u].substr(offset, d));
    printAllPathsUtil(u, offset, 0, path, path_index, kmerpath);
  } else // If current vertex is not destination
  {
    // Recur for all the vertices adjacent to current vertex
    list < int > ::iterator i;
    kmerpath.append(nodelabel[u].substr(offset, (nodelabel[u].length() - offset)));
    for (i = adj[u].begin(); i != adj[u].end(); ++i) {
      printAllPathsUtil( * i, 0, (d - (nodelabel[u].length() - offset)), path, path_index, kmerpath);
    }
  }
  path_index--; // Remove current vertex from path[]

}
图g(4);//4节点
g、 增补(0,1);
g、 增补(0,2);
g、 增补(2,0);
g、 增编(2,3);
g、 增编(3,3);
g、 添加标签(0,“AAGT”);
g、 addLabel(1,“CCTC”);
g、 addLabel(2,“TTCC”);
g、 添加标签(3,“CTC”);
映射nodelabel;//包含对应于每个节点id的Nodelabel的映射
void图形::addLabel(int v,字符串s){
nodelabel[v]=s;//将w添加到v的列表中。
}
void图形::printallpath(int源、int深度){
字符串kmerpath;
int*path=newint[V];
int path_index=0;//将路径[]初始化为空
//调用递归助手函数以打印所有路径
对于(int offset=0;offset
有时,当使用递归与循环时,并不总是很清楚。递归通常被认为更为复杂,并且经常与函数式编程相关联,目的是非常线程安全。但是,如果递归太深,可能会很快耗尽堆栈内存

假设您有一个简单的函数:

char* foo()
{
  char a[100000];
  memset(a, 0, 100000);
  return a;
}
程序知道在被调用时要分配多少内存(100000字节,外加一点指令)

如果您从其他地方调用
foo()
,则程序知道将
foo()
的内存分配给
bar()
加上一点
bar()

char bar()
{
  if (condition)
  {
    return foo() + bar();
  }
  else return 0;
}
但是,如果您使
bar()
递归,那么程序实际上不知道要分配多少,因为它不知道要分配多少次。这是一个合理的猜测,但是如果超出了猜测所支持的深度,那么就会出现堆栈溢出

解决方案是在深度过深时循环:

char bar()
{
  char* a;
  while (condition)
  {
    a += foo();
  }
  return a;
}
在这种情况下,我们失去了设计的
功能方面,但我们一次只调用
foo()
,因此每次重置循环时都会再次释放内存


我希望这个解释是有帮助和正确的。我知道函数没有什么意义,但希望能给你一个想法。

你在C++中编程,你写的就是你。那你为什么把这个问题标为C?C和C++不是同一种语言,不要混淆它们。抱歉。我想有C知识的人也可以在这方面帮助我。@rombi“有人能告诉我发生分段错误的原因吗?”堆栈溢出?当你使用递归时,这是最有可能的。尝试用循环ANSA
std::stack
@πάντα替换递归ῥεῖ 显示分段故障(堆芯倾倒)。您是否认为存在堆栈溢出错误。如果是,那么如何纠正?@rombi“那么如何纠正?”我已经解释过:不要使用递归。
char bar()
{
  char* a;
  while (condition)
  {
    a += foo();
  }
  return a;
}