我现在在C上遇到错误,这是第一次使用Visual Studio并首次使用“链表”,我正试图使项目结构化一些,因此,我面临一些挑战。
我面临的错误是,当我尝试在链接列表中插入元素时,我的程序崩溃了,并给了我这个错误:

在Lesson_LinkedLists.exe中的0x500CC944(ucrtbased.dll)处生成的异常:0xC0000005:写入本地0xCDCDCDCD时发生访问冲突。

我对这个错误感到困惑,因为它确实不能为我提供足够的信息,因此我可以通过互联网进行搜索。

这是我的结构,内存分配和插入功能:

typedef struct Word
{
    char Text[Max_Letters];
}*pt_Word;

typedef struct Node_Element
{
    pt_Word Word_Data;
    struct Node_Element * Next_Node_Element;
}*pt_Node_Element;

typedef struct List
{
    char Language[2];
    int Number_Words_List;
    pt_Node_Element Header;
}*pt_List;

pt_List List_Dynamic_Memory();

pt_Node_Element Node_Dynamic_Memory();

void Insert_Element_Begin(pt_Node_Element Node_Element, pt_List List_Pointer);

int main()
{
    int option;
    pt_Node_Element Node;
    pt_List List;
    List = List_Dynamic_Memory();
    Node = Node_Dynamic_Memory();

    do
    {
        option = menu();
        switch (option)
        {
            case 1:
            {
                printf("Diga-me uma palavra : \n");
                //  fflush(stdin);
                gets_s(Node->Word_Data->Text);
                Insert_Element_Begin(Node, List);
                break;
            }
            case 2:
            {
                Display_List(Node, List); break;
            }
        }
    } while (option != 0);
    //system("Pause");
}

pt_List List_Dynamic_Memory()
{
    pt_List List_Pointer;

    List_Pointer = (pt_List)malloc(sizeof(struct List));

    List_Pointer->Header = NULL;
    List_Pointer->Number_Words_List = 0;

    return List_Pointer;

};

pt_Node_Element Node_Dynamic_Memory()
{
    pt_Node_Element  Node_Pointer;

    Node_Pointer = (pt_Node_Element)malloc(sizeof(struct Node_Element));

    Node_Pointer->Next_Node_Element = NULL;

    return Node_Pointer;
};

void Insert_Element_Begin(pt_Node_Element Node_Element, pt_List List_Pointer)
{
    List_Pointer->Number_Words_List++;

    if (List_Pointer->Header == NULL)
    {
        List_Pointer->Header = Node_Element;
        Node_Element->Next_Node_Element = NULL;

        return;
    }

    Node_Element->Next_Node_Element = List_Pointer->Header;
    List_Pointer->Header = Node_Element;
};


我想知道这是否与内存分配有关,我是一个初学者,所以很抱歉是否是一个愚蠢的错误。
我在这里先向您的帮助表示感谢。

最佳答案

如注释中所述,您永远不会为Word_Data分配空间。要解决此问题,可以使用malloc()

pt_Node_Element Node_Dynamic_Memory()
{
    pt_Node_Element  Node_Pointer;

    Node_Pointer = (pt_Node_Element)malloc(sizeof(struct Node_Element));

    // Alloc mem for this too
    Node_Ponter->Word_Data = malloc(sizeof(struct Word));

    // You should also always check the value returned from malloc

    Node_Pointer->Next_Node_Element = NULL;

    return Node_Pointer;
};


在注释中还提到了隐藏所有这些类型都是指针的事实。这样做很容易忘记您正在处理指针。我建议不要这样做。

最后,我认为Word_Data不必成为指针。如果不是,您将不会遇到此错误:

struct Node_Element
{
    struct Word Word_Data;  // Does not need malloc
    struct Node_Element * Next_Node_Element;
};


并且,不要忘记对free的所有内容进行malloc

关于c - C链表无法插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50067944/

10-12 00:20
查看更多