链表:脱队列正确返回弹出的数据,但在尝试使用print时出现分段错误



我试图在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时,您将解引用指向未分配内存的指针,导致未定义行为

简单的解决方案?在释放节点之前打印

相关内容

  • 没有找到相关文章

最新更新