gpt4 book ai didi

c - 链接列表 : Dequeue correctly returns popped data, 但尝试使用打印时出现段错误

转载 作者:行者123 更新时间:2023-11-30 15:33:00 24 4
gpt4 key购买 nike

我正在尝试用 C 实现链接列表,并且在大多数情况下它似乎可以工作。但是当我尝试使用队列/出队功能时,事情就崩溃了。

在下面的调试 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: %s\n", 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: %s\n", output);

首先让output指向cursor->data,然后释放cursor,也许会释放data还有?在这种情况下,当您下次取消引用 output 时,您会取消引用指向未分配内存的指针,从而导致 undefined behavior .

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

关于c - 链接列表 : Dequeue correctly returns popped data, 但尝试使用打印时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23864029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com