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))您已分配第三个节点。第二个分配的位置和时间?Read
q->tail
初始化为
NULL
,您想访问
q->tail->next
。。。。。这就是问题所在!您可以先更改
q->tail
的值,然后再查看
q->tail->next
请使用调试器。什么是
q->tail
?添加到队列中的第一个节点会发生什么情况?
q->tail->next=newNode:此处
优先级\u队列q
您分配了第一个节点,这里
Qnode*newNode=malloc(sizeof(Qnode))您已分配第三个节点。第二个分配的位置和时间?Read
q->tail
初始化为
NULL
,您想访问
q->tail->next
。。。。。这就是问题所在!您可以先更改
q->tail
的值,然后再查看
q->tail->next