尝试访问指针列表中的指针时出现 C 总线错误,该指针是指向指针的结构点

C bus error when trying to acces a pointer in a pointer list, which is a struct point to a pointer

每当我尝试执行以下操作时,我都会收到总线错误:

#include <stdio.h>
#include <stdlib.h>

// The nodes that hold the data
typedef struct node {
    struct node *next;
    struct node *previous;
} Node;

// The list of the data
typedef struct list {
    Node* head; // start of list of data
    Node* tail; // end of list of data
} List;

// A vertex node, e.g. node 1. The list represents all the nodes (aka vertecies) that this vertex is connected to
typedef struct vertex {
    List *L; // all the connected nodes (called nodes but is actually the numbers this node is connected to)
} Vertex;

// the list of all the vertices, which in themselves contain which nodes they are connected to (using a linked list)
typedef struct list_of_vertices {
    Vertex** Lv;
} l_vertex;

// creats a list with init values of NULL, so we do not access garbage memory later on.
List* createL() {
    List* L = malloc(sizeof(List));
    L->head = NULL;
    L->tail = NULL;

    return L;
}

int main() {
    l_vertex* L = malloc(sizeof(l_vertex));
    L->Lv = malloc(sizeof(Vertex)*5); // 5 vertices in the list of vertex

    for(int i = 0; i < 5; i++) {
        L->Lv[i]->L = createL();
    }

    if(!L->Lv[0]->L->head) { // crash (bus error)
        printf("There was no init\n");
    }

    return 0;
}

我没有收到任何编译器错误。我想要做的是有一个顶点列表,每个顶点都有一个链接列表,它们连接到哪个顶点。这意味着 l_vertex -> 顶点列表 -> 单个顶点 -> 连接列表 -> 单个连接。

如何实现这一点以及为什么会出现“总线错误”?我知道总线错误是,例如,当您尝试访问未分配的内存时。

您已将 l_vertexLv 成员定义为指向 Vertex:

的指针
typedef struct list_of_vertices {
    Vertex** Lv;
} l_vertex;

这意味着 Lv 可以包含指向 Vertex 的指针数组。但是然后在这里:

L->Lv = malloc(sizeof(Vertex)*5); 

您为 Vertex 的 5 个实例而不是 Vertex 的 5 个实例分配了 space,因此您没有分配正确数量的 space。然后当你这样做时:

L->Lv[i]->L = createL();

指针 L->Lv[i] 尚未初始化,因此尝试取消引用它会触发 undefined behavior

你在l_vertex中真正想要的是保存一个Vertex的数组,所以把它改成:

typedef struct list_of_vertices {
    Vertex *Lv;
} l_vertex;

这随后使分配正确。然后您将像这样访问 Vertex

L->Lv[i].L = createL();