c-当我试图出列时,为什么我的队列会抛出内存分段错误



我编码了一个Queue,入队功能正常工作。它将新节点添加到列表的后面。为了节省时间,我为出队方法使用了另一个指针。我使用了一个指向最旧节点的尾部指针。在创建队列(第一个节点(期间,将头指针分配给尾指针。之后,在出队列函数中,尾部指针成为其父指针,然后释放指针,然后返回结构。现在,当我编写一个测试队列的程序时,当调用dequeue((时,它会抛出一个内存分段错误。为什么?

这是队列的代码:

#include <stdio.h>
#include <stdlib.h>
/*uncomment the 4th line of size is more important to you than speed. The program will then take
more cpu cycles to read certain members of the structure, but it wont use padding, which wastes memory 
but increases speed.*/
//#define SIZE_OVER_SPEED
#ifdef SIZE_OVER_SPEED
#pragma pack(1)
#endif
struct node{
int data;
struct node *next;
struct node *parent;
};
#ifdef SIZE_OVER_SPEED
#pragma pack(0)
#endif
typedef struct node _LINKED_LIST_QUEUE;
void enqueue(int,_LINKED_LIST_QUEUE**,_LINKED_LIST_QUEUE*);
void enqueue(int value, _LINKED_LIST_QUEUE **queue_head, _LINKED_LIST_QUEUE *tail){
if(*queue_head==NULL){
*queue_head=(_LINKED_LIST_QUEUE*)malloc(sizeof(_LINKED_LIST_QUEUE));
if(*queue_head==NULL){
perror("[malloc]");
exit(EXIT_FAILURE);
}
(**queue_head).data=value;
(**queue_head).parent=NULL;
(**queue_head).next=NULL;
tail=*queue_head;
return;
}
_LINKED_LIST_QUEUE *save_head=*queue_head;
*queue_head=(_LINKED_LIST_QUEUE*)malloc(sizeof(_LINKED_LIST_QUEUE));
if(*queue_head==NULL){
perror("[malloc]");
exit(EXIT_FAILURE);
}
(**queue_head).data=value;
(**queue_head).parent=NULL;
(**queue_head).next=save_head;
(*save_head).parent=*queue_head;
}
_LINKED_LIST_QUEUE dequeue(_LINKED_LIST_QUEUE *tail, int *SIGEND){
_LINKED_LIST_QUEUE retstruct=*tail;
if((*tail).parent==NULL){
*SIGEND=1;
}
tail=(*tail).parent;
free((*tail).next);
return retstruct;
}

这是测试程序的代码。

#include "main.c"
void normal_traverse(_LINKED_LIST_QUEUE *head){
_LINKED_LIST_QUEUE *selected=head;
while(selected!=NULL){
printf("%dt",(*selected).data);
selected=(*selected).next;
}
puts("");
}
int main(){
_LINKED_LIST_QUEUE *head, *tail;
int end=0;
head=NULL;
enqueue(1,&head,tail);
enqueue(2,&head,tail);
enqueue(3,&head,tail);
enqueue(4,&head,tail);
normal_traverse(head);
printf("%dn",(dequeue(tail,end)).data);
printf("%dn",(dequeue(tail,end)).data);
printf("%dn",(dequeue(tail,end)).data);
printf("%dn",(dequeue(tail,end)).data);
return 0;
}

@Gerhardh指出,头指针被分配给tail'. So, I made尾的本地副本,这是一个双指针。这解决了我的问题。

最新更新