我的LINKED_LIST指针如何仍为NULL?

时间:2012-02-07 20:02:03

标签: c linked-list

主要功能:

int main()
{
    if((ban_file = open_file("banned_ips.txt")) == NULL)
        goto exit;

    ban_lst = NULL;
    cpy_to_list(ban_file, ban_lst);
    close_file(ban_file);
    dealloc_list(ban_lst);
exit:
    return 0;
}

cpy_to_list函数:

void cpy_to_list(FILE *file, LINKED_LIST *lst)
{
    char *line = malloc(1024);

    while((line = fgets(line, 1024, file)) != NULL)
    {
        add_node(line, lst);
    }

    free(line);
}

add_node,dealloc_list& create_list:

LINKED_LIST *create_list(void)
{
    LINKED_LIST *tmp;

    if((tmp = malloc(sizeof(LINKED_LIST))) == NULL)
        perror("Error during memory allocation");

    return tmp;
}

void add_node(const char *str, LINKED_LIST *lst)
{
    struct list_node *tmp_node;

    tmp_node = create_list();
    tmp_node->str = str;

    if(lst != NULL)
    {
        tmp_node->next = lst;
        lst = tmp_node;
    }
    else
    {
        lst = tmp_node;
        lst->next = NULL;
    }
}

void dealloc_list(LINKED_LIST *ptr)
{
    free(ptr);
}

为什么ban_lst是一个NULL指针?

2 个答案:

答案 0 :(得分:3)

cpy_to_list(ban_file, ban_lst);

无论它做什么,此功能都无法改变ban_lst指向的内容。无论它做什么,在通话结束时ban_lst将指向它之前指向的位置。也许您希望cpy_to_list接受LINKED_LIST **

您的add_node函数更能表达问题。

lst = tmp_node;

此行仅更改指针的功能构思。它不会改变调用者的任何内容。

C FAQ涉及此主题。

答案 1 :(得分:3)

C是一种按值传递的语言。您将ban_lst传递给cpy_to_list(),但无法从调用者的角度更改它。