分段错误,无法创建节点的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);
}