尝试访问指针列表中的指针时出现 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_vertex
的 Lv
成员定义为指向 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();
每当我尝试执行以下操作时,我都会收到总线错误:
#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_vertex
的 Lv
成员定义为指向 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();