c - 隔离错误释放内存 - 仅当分配的内存过多时



我试图将文件中的单词(每行只有一个单词的格式(读取到单向链表中。下面的代码适用于小文件。一旦我开始向要读取的文件添加大量行,我就会开始出现段错误。

给出段错误的行是这样的:free(a->word)来自destroy()函数。再次,我想指出两件事:

1(无论文件有多大,如果我不调用destroy()函数,代码都可以正常工作;

2(如果我调用destroy()函数并且word文件很小(少于100k行(,代码也可以正常工作。

我对可能导致这种行为的原因感到迷茫。有什么想法吗?谢谢!

 typedef struct dictionary_entry
{
    char *word;
    struct dictionary_entry *next;
}
dictionary_entry;
dictionary_entry *head;
int LENGTH = 50;
int destroy(dictionary_entry *a)
{
    if (a == NULL)
    {
        free(a);
    }
    else
    {
        destroy(a->next);
        free(a->word);
        free(a);
    }
    return 0;
}
void push(char *a)
{
    dictionary_entry *new_data = malloc(sizeof(dictionary_entry));
    new_data->word = a;
    new_data->next = head;
    head = new_data;
}
int main(void)
{
    head = NULL;
    char dictionary_word[LENGTH + 2]; //extra chars for the  and n
    char *added_word = NULL;
    FILE *file = fopen("./victor", "r");
    if (file == NULL)
    {
        return 1;
    }
    while (fgets(dictionary_word, LENGTH + 1, file) != NULL)
    {
        added_word = malloc((LENGTH + 2) * sizeof(char));
        strcpy(added_word, dictionary_word);
        push(added_word);
    }
    fclose(file);
    if (destroy(head) == 0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}    

如果链表太大,堆栈可能会从递归调用中溢出。请尝试迭代方法:

int destroy(dictionary_entry *a)
{
    while(a)
    {
        dictionary_entry *next = a->next;
        free(a->word);
        free(a);
        a = next;
    }
    return 0;
}

最新更新