C:访问动态分配的元素时出错

时间:2012-11-28 20:18:04

标签: c

我正在尝试编写一个搜索某个元素的函数。但是,当我尝试访问元素时,它存在错误。我评论了在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;
}

1 个答案:

答案 0 :(得分:2)

您的init函数构建了一个两级树,其中包含一个初始化的根节点和一组完全未初始化的子节点(实际上是3个)。您的所有子节点都包含垃圾。

执行search(B, 2)时,它将查看根节点,然后递归调用其中一个未初始化的子节点search(实际上是最后一个)。由于子节点未初始化,代码将崩溃或做其他完全不可预测的事情。

在尝试搜索树中的任何内容之前,请正确初始化树。