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)
我猜我没有正确地动态分配我的内存,但是我的函数的编写方式,我从一个结构指向下一个结构,所以有没有办法解决这个问题?
在您的代码中,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)