C SEGFULT释放内存-仅当分配的内存过多时

C SEGFULT释放内存-仅当分配的内存过多时,c,pointers,segmentation-fault,free,singly-linked-list,C,Pointers,Segmentation Fault,Free,Singly Linked List,我试图从一个文件(每行只有一个单词的格式)中读取单词到一个单链表中。下面的代码适用于小文件。一旦我开始向要读取的文件中添加很多行,就会出现segfault错误 给出segfault的行是:free(a->word)来自destroy()函数。我想再次指出两件事: 1) 如果我不调用destroy()函数,无论文件有多大,代码都可以正常工作 2) 如果我调用destroy()函数并且word文件很小(少于100k行),那么代码也可以正常工作 我不知道是什么导致了这种行为。有什么想法吗?谢谢 ty

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

给出segfault的行是:
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 \0 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;
}

@保罗格尔维自由(空);被定义为禁止行为。这样做是可以的,但我不鼓励。问题是在
free(a)
之后,我不能调用
a->next
。不是吗?嗯,哎呀。你说得对。我会修好的,等一下。好了。现在工作顺利吗?是的,很好。谢谢!我花了好几个小时思考和谷歌搜索,而你却把它钉在了一个secong上……老实说,我之所以钉上这个,是因为我今天早些时候在做一个编程比赛,发现堆栈溢出导致了一个segfault。这几乎只是巧合。