&引用;堆已损坏";使用malloc两次后

&引用;堆已损坏";使用malloc两次后,c,visual-studio,malloc,heap-memory,C,Visual Studio,Malloc,Heap Memory,我有一个“单词”的链接列表,我正在尝试构建,我创建了一个名为“add_to_mem”的函数,它将下一个单词添加到链接列表中。 我对代码进行了几次检查,发现他工作了两次——一次是当链表为空时,一次是当它不为空时——它确实工作了,但在第三次调用该方法时,我得到了一个“a heap has corrupted”错误。 守则: typedef struct { unsigned int val : 14; } word; typedef struct machine_m {

我有一个“单词”的链接列表,我正在尝试构建,我创建了一个名为“add_to_mem”的函数,它将下一个单词添加到链接列表中。 我对代码进行了几次检查,发现他工作了两次——一次是当链表为空时,一次是当它不为空时——它确实工作了,但在第三次调用该方法时,我得到了一个“a heap has corrupted”错误。 守则:

    typedef struct { unsigned int val : 14; } word;

    typedef struct machine_m

    {

    word * current;
    int line_in_memo;
    char * sign_name;

    struct machine_m * next_line;
}Machine_Memo;
职能:

    /*Adding a word to the memory.*/
void add_to_mem(word * wrd, int line, char * sign_name)
{
    Machine_Memo * temp = NULL, *next = NULL;
    if (machine_code == NULL)
    {

        machine_code = (Machine_Memo *)malloc(sizeof(Machine_Memo));
        if (machine_code == NULL)
        {
            printf("Memory allocation has failed.");
            exit(1);
        }
        machine_code->current = wrd;
        machine_code->line_in_memo = line;
        machine_code->sign_name = sign_name;
        machine_code->next_line = NULL;

    }
    else
    {
        printf("token has been reached");
        temp = machine_code;
        next = (Machine_Memo *)malloc(sizeof(Machine_Memo)); //Line of error
        if (next == NULL)
        {
            printf("MEMORY ALLOCATION HAS FAILED. EXITING PROGRAM.\nThe problem has occured on code line %d", 775);
            exit(0);
        }
        next->current = wrd;
        next->line_in_memo = line;
        next->sign_name = sign_name;
        next->next_line = NULL;

        while (temp->next_line != NULL)
        {
            temp = temp->next_line;
            temp->next_line = next;

        }


    }
}
这里


您可能希望将最后一个赋值移到循环之外。

据我所知,代码不会创建链表。它创建节点,但不将它们链接在一起

在第一次调用时,创建机器代码(列表头)。 在下一次调用时,将创建节点“next”,但是,循环:

while (temp->next_line != NULL)
    {
        temp = temp->next_line;
        temp->next_line = next;
    }
不执行任何操作,因为“机器代码->下一步”值为空。因此循环中的代码不会被执行。我们这里没有链接的列表,但是零星的节点彼此没有连接。 您可能希望(正如这里的另一篇文章所指出的)有如下内容:

while (temp->next_line != NULL)
    {
        temp = temp->next_line;
    }
temp->next_line = next;

避免使用全局变量(即
machine\u code
)就可以了,但要从中学习-为什么不使用全局变量?请看这里:显然,全局变量是不好的,因为私有封装是好的。研究私有封装。问题不会重现。但无论如何,函数中的每个
malloc
都会泄漏大量内存。你不必把指向
word
的指针放在你的机器里。我不小心把
temp->next\u line=next
放在了循环里,现在当它再次出现时,它仍然不工作,我也遇到了同样的问题。你能添加调用代码吗,这样我们就可以得到一个完整的程序,我们可以检查。整个程序超过900行,如果您愿意,我可以将其上传到github,但我认为这与函数的行为无关。我认为堆损坏的问题不在于您发布的代码,而在于您程序的其他代码。我建议您尝试通过编写导致您遇到问题的尽可能小的程序来隔离问题。顺便说一句,有一些用于堆损坏检测的工具。好吧,当我越来越多地思考这个问题时,这个问题可能是由一个永恒的来源引起的,比如它的输入,将一个14位的结构复制到一个
类型是一个好主意,这可能是导致它的原因吗?我现在要试着调试它
while (temp->next_line != NULL)
    {
        temp = temp->next_line;
    }
temp->next_line = next;