C LinkedList遍历随机崩溃
我正在处理一个图形问题,所以我的程序有一个初始化,它使用一个邻接列表设置所有连接。目前遇到了一个非常奇怪的错误,我想知道是否有人可以提供一些关于可能发生的事情的见解 所以我有一个函数,可以设置一个连接C LinkedList遍历随机崩溃,c,algorithm,pointers,data-structures,linked-list,C,Algorithm,Pointers,Data Structures,Linked List,我正在处理一个图形问题,所以我的程序有一个初始化,它使用一个邻接列表设置所有连接。目前遇到了一个非常奇怪的错误,我想知道是否有人可以提供一些关于可能发生的事情的见解 所以我有一个函数,可以设置一个连接 void setConnection(Graph g, int sVertex, int eVertex){ ListNode *newNode = (ListNode *) malloc(sizeof(ListNode*)); newNode->vertex = eVert
void setConnection(Graph g, int sVertex, int eVertex){
ListNode *newNode = (ListNode *) malloc(sizeof(ListNode*));
newNode->vertex = eVertex;
ListNode *temp = g.list[sVertex-1];
if (temp == NULL){ // Corresponding list is empty
newNode->next = NULL;
g.list[sVertex-1] = newNode;
}
else{ // Insert new node to the front
newNode->next = temp; // set newNode's next to current 'head'
g.list[sVertex-1] = newNode; // Replace head as newNode
}
//printf("Connection set from %d to %d\n", sVertex, g.list[sVertex-1]->vertex);
return;
}
初始化之后,我通常会尝试打印邻接列表以检查逻辑是否正确。功能如下:
void printGraphList(Graph g){
int i;
ListNode* temp;
for(i=0;i<g.V;i++)
{
printf("|");
printf("%d:\t",i+1);
temp = g.list[i];
while(temp != NULL){
printf("%d -> ",temp->vertex);
temp = temp->next;
}
printf("\n");
}
}
由于某些原因,在某些情况下,插入的第一个节点没有正确地将其->下一个设置为NULL。因此,在列表遍历中,它不能正确退出,因此无法获得temp->vertex,因此导致崩溃
我还调试了setConnection,以确保链接设置正确,就像实际指针值本身T.T一样
下面是一个工作运行和一个问题运行的示例。我打印了一个&在打印顶点之前和@之后。如图所示,对于顶点7,它应该只链接到顶点9和10,但在问题运行中,似乎9的下一个节点没有正确设置为NULL,导致程序在尝试获取节点9的->下一个->顶点时崩溃,因为它不存在
如前所述,这种情况每3到4次就发生一次,我不知道是什么导致这种不一致。感谢您的帮助!提前谢谢
是否确定初始化时所有节点的
g
都初始化为NULL?请提供一个。也就是说,任何人都可以完全按照所示运行以重新处理问题的最小完整代码量。malloc(sizeof(ListNode*))
->malloc(sizeof(ListNode))
提示:在malloc中使用错误类型是常见错误。为了避免这种情况,请使用以下形式:ListNode*newNode=malloc(sizeof(*newNode))代码>。也就是说,将变量本身用于sizeof
,以确保它与指针的确切类型相匹配。这在C中称为未定义行为。实际上,这意味着程序可能会崩溃,或者可能会得到垃圾值,甚至可能看起来“工作”。但这种行为随时可能发生变化,因此程序本质上是不稳定的。让它崩溃实际上是开发过程中最好的结果,因为等待爆发的隐藏问题是最糟糕的。见:
printf("%d -> ", temp->vertex);