我正在尝试编写一个搜索某个元素的函数。但是,当我尝试访问元素时,它存在错误。我评论了在search
函数中生成错误的行。
#include <stdlib.h>
#include <stdio.h>
#define m 2
typedef struct pag {
int nr;
int key[m];
struct pag * child[m + 1];
}* page;
page init(page B) {
int i;
B = malloc(sizeof(struct pag));
for (i = 0; i < m; i++) {
B->key[i] = 0;
B->child[i] = malloc(sizeof(struct pag));
}
B->child[i] = malloc(sizeof(struct pag));
return B;
}
page search(page B, int k) {
int i;
if (B == NULL )
return B;
// 1. cautare liniara
for (i = 0; i < m; i++) {
// 2. find the desired value
if (B->key[i] == k) {
return B;
// 3. find the value greater or equal, take the left road to the child
} else if (B->key[i] >= k) {
return search(B->child[i], k); //exists with error here
}
}
return search(B->child[i], k); //also exists with error here
}
int main() {
page B = init(B);
if (search(B, 2) == NULL )
printf("Negasit");
else
printf("Gasit");
return 0;
}
答案 0 :(得分:2)
您的init
函数构建了一个两级树,其中包含一个初始化的根节点和一组完全未初始化的子节点(实际上是3个)。您的所有子节点都包含垃圾。
执行search(B, 2)
时,它将查看根节点,然后递归调用其中一个未初始化的子节点search
(实际上是最后一个)。由于子节点未初始化,代码将崩溃或做其他完全不可预测的事情。
在尝试搜索树中的任何内容之前,请正确初始化树。