C中不同结构中指针指向指针的分段错误
我试图创建一个优先级队列链表,但一直遇到分段错误 我的结构定义如下C中不同结构中指针指向指针的分段错误,c,pointers,segmentation-fault,C,Pointers,Segmentation Fault,我试图创建一个优先级队列链表,但一直遇到分段错误 我的结构定义如下 typedef struct node { char *new_element; struct node *next; int priority; } Qnode; typedef struct { Qnode *top; Qnode *tail; int size; } Priority_queue; int main() { Priority_queue q; init
typedef struct node {
char *new_element;
struct node *next;
int priority;
} Qnode;
typedef struct {
Qnode *top;
Qnode *tail;
int size;
} Priority_queue;
int main() {
Priority_queue q;
init(&q);
enqueue(&q, "hi", 1);
return 0;
}
void init(Priority_queue *const q) {
q->top = NULL;
q->tail = NULL;
q->size = 0;
return 0;
}
下面是导致错误的排队方法
void enqueue(Priority_queue *const q, const char new_element[], int priority) {
/*......*/
Qnode *newNode = (Qnode*) malloc(sizeof(Qnode));
q->tail->next = newNode; /*causes segmentation fault*/
q->tail = newNode; /*doesn't cause segmentation fault*/
/*.......*/
}
我猜我没有正确地动态分配内存,但是我的函数的编写方式是从一个结构指向下一个结构,所以有办法解决这个问题吗?在代码中,init()
用NULL初始化q->tail
。您正在尝试执行q->tail->next=newNode
。对于第一个节点,它基本上意味着NULL->next=newNode
。这就是分割错误的原因
您的enqueue()
应该如下所示:
void enqueue(Priority_queue *const q, const char new_element[], int priority) {
/*......*/
Qnode *newNode = (Qnode*) malloc(sizeof(Qnode));
if (q->tail) { /*Do this, only When first node is already allocated*/
q->tail->next = newNode;
}
q->tail = newNode;
/*.......*/
}
在您的代码中,init()
用NULL初始化q->tail
。您正在尝试执行q->tail->next=newNode
。对于第一个节点,它基本上意味着NULL->next=newNode
。这就是分割错误的原因
您的enqueue()
应该如下所示:
void enqueue(Priority_queue *const q, const char new_element[], int priority) {
/*......*/
Qnode *newNode = (Qnode*) malloc(sizeof(Qnode));
if (q->tail) { /*Do this, only When first node is already allocated*/
q->tail->next = newNode;
}
q->tail = newNode;
/*.......*/
}
请使用调试器。什么是
q->tail
?添加到队列中的第一个节点会发生什么情况?q->tail->next=newNode代码>:此处优先级\u队列q
您分配了第一个节点,这里Qnode*newNode=malloc(sizeof(Qnode))代码>您已分配第三个节点。第二个分配的位置和时间?Readq->tail
初始化为NULL
,您想访问q->tail->next
。。。。。这就是问题所在!您可以先更改q->tail
的值,然后再查看q->tail->next
请使用调试器。什么是q->tail
?添加到队列中的第一个节点会发生什么情况?q->tail->next=newNode代码>:此处优先级\u队列q
您分配了第一个节点,这里Qnode*newNode=malloc(sizeof(Qnode))代码>您已分配第三个节点。第二个分配的位置和时间?Readq->tail
初始化为NULL
,您想访问q->tail->next
。。。。。这就是问题所在!您可以先更改q->tail
的值,然后再查看q->tail->next