我现在正面临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;
};
我想知道它是否与内存分配有关,我是一个初学者,所以如果这是一个愚蠢的错误,我很抱歉。 感谢您的帮助。
答案 0 :(得分:0)
如评论中所述,您永远不会为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
所有内容。