带有指向C中不同结构中指针的指针的分段错误

use*_*498 1 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(&q);
    enqueue(&q, "hi", 1);
    return 0;
}

void init(Priority_queue *const q) {
    q->top = NULL;
    q->tail = NULL;
    q->size = 0;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和我的入队方法,错误是在下面引起的

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*/


   /*.......*/
}
Run Code Online (Sandbox Code Playgroud)

我猜我没有正确地动态分配我的内存,但是我的函数的编写方式,我从一个结构指向下一个结构,所以有没有办法解决这个问题?

con*_*r2d 5

在您的代码中,init()初始化q->tail为 NULL。而你正在努力做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; 

    /*.......*/

}
Run Code Online (Sandbox Code Playgroud)