我试图在C中实现链表,并且在大多数情况下它似乎是有效的。但是当我尝试使用queue/dequeue功能时,事情就崩溃了。
在下面的调试printf语句中,当我将字符串排队时,要返回的输出能够很好地打印出来。但是当我试图在函数之外使用它时,当它返回时,我最终遇到了分割错误。
像_next()这样的函数工作得很好。
void* LinkedList_dequeue(LinkedList* list)
{
Node* beforeNext = NULL; //Keep track of node before cursor
Node* toDelete; //Remember to free memory!
void* output;
if(LinkedList_isEmpty(list)){ //Check if list is empty
return NULL; //Empty; return NULL
}else{ //List is not empty; continue
while(LinkedList_isNext(list)){ //Iterate to end.
beforeNext = list->cursor;
LinkedList_next(list);
}
output = list->cursor->data;
toDelete = list->cursor;
if(beforeNext){ //beforeNext is not NULL
beforeNext->next = NULL; //Sever connection
}else{
list->cursor = NULL; //Else, set cursor to NULL
list->head = NULL;
}
LinkedList_resetCursor(list); //Reset cursor.
Node_free(toDelete); //Clean up
printf("Output: %sn", output); //TODO DEBUG
return output;
}
}
结构:
/*//////////////////////////////////////////////////////////////////////////*/
/*STRUCT: */
/* LinkedList */
/*Linked List data structure */
/* */
/*Members: */
/* Node* head: */
/* The head node of the list */
/* Node* cursor: */
/* Internal pointer */
/*//////////////////////////////////////////////////////////////////////////*/
typedef struct LinkedList{
Node* head;
Node* cursor;
} LinkedList;
#endif
/*//////////////////////////////////////////////////////////////////////////*/
/*STRUCT: */
/* Node */
/*Nodes for LinkedList struct */
/* */
/*Members: */
/* Node* next: */
/* Appended child node */
/* void* data: */
/* Data held in the node */
/*//////////////////////////////////////////////////////////////////////////*/
typedef struct Node{
struct Node* next;
void* data;
} Node;
如果我的代码的其余部分是需要的,我也可以张贴。
我猜是这些行是罪魁祸首:
output = list->cursor->data;
toDelete = list->cursor;
...
Node_free(toDelete); //Clean up
printf("Output: %sn", output);
首先让output
指向cursor->data
,然后释放cursor
,也许也释放data
?在这种情况下,当您下次解引用output
时,您将解引用指向未分配内存的指针,导致未定义行为。
简单的解决方案?在释放节点之前打印