BST表实现段错误(C)

时间:2018-11-24 20:56:24

标签: c segmentation-fault associative-array

我一直在尝试使用二进制搜索树在C中实现关联数组(int-> int)。但是,我当前的实现可靠地产生了段错误,我不确定为什么。如果这个问题很简单,我只是忽略了,我深表歉意。

代码:

#include <stdlib.h>
#include <stdio.h>

struct tree {
        int key;
        int value;
        struct tree *a;
        struct tree *b;
};

int summon (struct tree *t, int key) {
        if (t == NULL) {
                fprintf(stderr, "%s", "Key not in tree");
                exit(-1);
        } else {
                if (t -> key < key)
                        return summon(t -> a, key);
                else if (t -> key > key)
                        return summon(t -> b, key);
                else
                        return t -> value;
        }
}

struct tree _make (int key, int value) {
        struct tree ret;
        ret.key = key;
        ret.value = value;
        ret.a = ret.b = NULL;
        return ret;
}

void cast (struct tree *t, int key, int value) {
        if (key == t -> key) {
                t -> value = value;
        } else if (key > t -> key) {
                if (t -> a == NULL) {
                        struct tree n = _make(key, value);
                        t -> a = &n;
                } else {
                        cast(t -> a, key, value);
                }
        } else {
                if (t -> b == NULL) {
                        struct tree n = _make(key, value);
                        t -> b = &n;
                } else {
                        cast(t -> b, key, value);
                }
        }
}

int main (int argc, char **argv) {
        struct tree h = _make(5, 2);
        cast(&h, 16, 43);
        printf("%d", summon(&h, 16));
        return 0;
}

我在Ubuntu上使用gcc; gdb 没有有帮助。

1 个答案:

答案 0 :(得分:0)

例如,

if (t -> a == NULL) {
    struct tree n = _make(key, value);
    t -> a = &n;
}

您正在将指针存储到具有自动存储持续时间的变量中,并将其存储到t->a中。但是n的生存期在}结束,t->a成为悬挂指针;在任何情况下使用此类指针都会导致不确定的行为。

需要为此任务使用动态内存分配(malloc等)。