主要功能:
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是空指针?
cpy_to_list(ban_file, ban_lst);
无论它做什么,这个函数都无法改变ban_lst
指向的内容。无论它做了什么,在调用结束时,ban_lst
都将指向它之前指向的位置。也许您希望cpy_to_list
接受LINKED_LIST **
?
您的add_node
函数可以更好地表达问题。
lst = tmp_node;
这一行只改变了指针的函数思想。它不会更改来电者的任何内容。
这个C常见问题解答涉及这个主题。
C是一种传递值的语言。您将ban_lst
传递给cpy_to_list()
,但从调用者的角度来看,它无法更改它。