C 段故障函数参考

C Segmentation fault function reference

sizeH(node *ptr) 函数上的 if(ptr->is_word) 导致分段错误。

dictionary.c:120:13: runtime error: member access within null pointer of type 'node' (aka 'struct node')
dictionary.c:120:13: runtime error: load of null pointer of type '_Bool'
Segmentation fault

如果我在这个 if 条件之前将 if 条件添加到 return 特定值,代码将执行并且我确保根不为空 所以我想问题是 ptr 没有正确传递给 sizeH 函数。

unsigned int size(void)
{
    node *ptr = root;
    printf(ptr->is_word ? "true" : "false");
    unsigned int count = sizeH(ptr);
    printf("COUNTER IN SIZE %d\n" , count);
    return 0;
}

unsigned int sizeH(node *ptr){
    if(ptr->is_word)
    {
        return 1;
    }
    else
    {
        for(int x = 0; x < N; x++){
            return 0 + sizeH(ptr->children[x]);

        }
    }
    return 0;
}

您的 sizeH 函数存在一些基本问题。首先它不检查传入的 ptr 不是 NULL。这很可能发生,因为您的函数是递归的,并且您有为每个 child 节点调用的循环。

    for(int x = 0; x < N; x++){
        return 0 + sizeH(ptr->children[x]);

    }

除了循环中的代码是错误的,它只会在第一个 child 时被调用,这是第二个问题。因为您在循环中使用 return,所以它只会 运行 一次。相反,您应该为每个 child 节点计算 returned 的值,然后计算 return 那个。

进行上述两项更改将使您的函数看起来像这样。

unsigned int sizeH(node *ptr) {
    if(ptr==NULL) {
        return 0;
    } else if(ptr->is_word) {
        return 1;
    } else {
        unsigned int ret = 0;
        for(int x = 0; x < N; x++) {
            ret += sizeH(ptr->children[x]);
        }
        return ret;
    }
    // return 0; This isn't needed - the code will never reach here.
}

同样值得选择一种编码格式样式并坚持使用它而不是混合使用,因为它可以使代码更整洁。