C分段故障功能参考

时间:2019-01-16 09:53:13

标签: c dictionary cs50

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

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条件之前返回一个特定值,则代码将执行并且我确保根不为null 所以我想问题是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;
}

1 个答案:

答案 0 :(得分:2)

您的sizeH函数有两个基本问题。首先,它不会检查传入的ptr是否不是NULL。这很可能会发生,因为您的函数是递归的,并且每个子节点都会调用此循环。

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

    }

除了循环中的代码是错误的之外,只会为第一个孩子调用它,这是第二个问题。因为您在循环内使用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.
}

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