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);