分段错误,无法创建节点的malloc数组

分段错误,无法创建节点的malloc数组,c,arrays,malloc,C,Arrays,Malloc,我正在尝试创建一个函数path(),当用户在树中查找元素时,该函数将返回一个带有节点路径的节点指针数组。我尝试使用递归,但我不知道有什么错,函数路径有一个签名:Node*a,二叉树,int v,要查找的值,以及int*p类似于访问节点的计数器 这是我的密码: typedef struct nodo { int v; struct nodo *left, *right; } Nodo; Nodo **path(Nodo *a, int v, int *p) { (*p)++; N

我正在尝试创建一个函数
path()
,当用户在树中查找元素时,该函数将返回一个带有节点路径的节点指针数组。我尝试使用递归,但我不知道有什么错,函数路径有一个签名:
Node*a
,二叉树,
int v
,要查找的值,以及
int*p
类似于访问节点的计数器

这是我的密码:

typedef struct nodo {
  int v;
  struct nodo *left, *right;
} Nodo;

Nodo **path(Nodo *a, int v, int *p) {
  (*p)++;
  Nodo **r = NULL;
  if (a == NULL) {
    return NULL;
  }
  if (a->v == v) {
    r = (Nodo**)malloc((*p)*sizeof(Nodo*));
    r[(*p)-1] = a;
    return r;
  }

  else if (a->v < v) {
    Nodo **r = path(a->right, v, p);
    r[(*p)-1] = a;
    return r;
  }
  else if (a->v > v) {
    Nodo **r = path(a->left, v, p);
    r[(*p)-1] = a;
    return r;
  }
  return r;
}
typedef结构节点{
INTV;
结构节点*左,*右;
}野藤;
节点**路径(节点*a、整数v、整数*p){
(*p)++;
Nodo**r=NULL;
如果(a==NULL){
返回NULL;
}
如果(a->v==v){
r=(Nodo**)malloc((*p)*sizeof(Nodo*);
r[(*p)-1]=a;
返回r;
}
否则如果(a->v右侧,v,p);
r[(*p)-1]=a;
返回r;
}
否则如果(a->v>v){
节点**r=路径(a->左、v、p);
r[(*p)-1]=a;
返回r;
}
返回r;
}

原始代码的主要问题似乎是,保存当前深度的位置在所有递归之间共享,并且它只是不断递增,从不递减。我认为更简洁的方法是将深度作为实际数字传递,而不是作为指向共享深度位置的指针,如以下代码所示:

typedef struct nodo {
  int v;
  struct nodo *left, *right;
} Nodo;

Nodo **path(Nodo *a, int v, int depth) {
  Nodo **r;
  if (a == NULL) {
    return NULL;
  }
  if (a->v == v) {
    r = malloc((depth+1)*sizeof(Nodo*));
  }
  else if (a->v < v) {
    r = path(a->right, v, depth+1);
  }
  else {
    r = path(a->left, v, depth+1);
  }
  if (r != NULL) {
    r[depth] = a;
  }
  return r;
}

然后初始调用可以是,例如:
p=path(节点,值)

在检查
a==NULL
之前,您可能不应该递增
(*p)+
。它在哪一行崩溃?在调试器中运行它,找出
r[(*p)-1]=a
malloc
之后的代码范围
r[(*p)-1]=a,我假设
rama()
path()
?只有在实际找到该值时才分配内存,这意味着以前的所有导航都引用了
path()
返回的
NULL
指针。我猜这是你第一次撞车。你忘了问问题。您的问题是“如何找出导致分段错误的原因”?你在用什么调试器?谢谢,现在我明白了
Nodo **path_(Nodo *a, int v, int depth) {
  Nodo **r;
  if (a == NULL) {
    return NULL;
  }
  if (a->v == v) {
    r = malloc((depth+1)*sizeof(Nodo*));
  }
  else if (a->v < v) {
    r = path_(a->right, v, depth+1);
  }
  else {
    r = path_(a->left, v, depth+1);
  }
  if (r != NULL) {
    r[depth] = a;
  }
  return r;
}

Nodo **path(Nodo *a, int v) {
  return path_(a, v, 0);
}