主要功能:
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指针?
答案 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()
,但无法从调用者的角度更改它。