提问人:Grinza 提问时间:10/19/2023 最后编辑:Grinza 更新时间:10/19/2023 访问量:74
VS 代码在 C 语言中卡在 free() 上
VS code stucks at free() in C
问:
我有一个相当奇怪的问题,这可能是微不足道的,但我找不到原因: 我在链表上写了一些标准函数,特别是当我执行元素删除函数时,VScode 一旦进入 free() 就会冻结。 我快速检查了多个在线编译器上的代码,它有效,所以它一定是 VScode 问题。
功能:
void deleteData(Node** head, int data){
if(*head == NULL) return;
if((*head)->data == data){
Node *tempPtr = *head;
*head = (*head)->next;
free(tempPtr);
}
Node *prevPtr = NULL;
Node *currPtr = *head;
while(currPtr != NULL){
if(currPtr->data == data){
Node *tempPtr = currPtr;
prevPtr->next = currPtr->next;
currPtr = currPtr->next;
free(tempPtr);
}
else{
prevPtr = currPtr;
currPtr = currPtr->next;
}
}
}
“错误”的屏幕截图:
这很奇怪,因为它的行为就像我在那个点上放了一个断点,但事实并非如此,所以我不明白它可能依赖于什么。
答:
1赞
user19151114
10/19/2023
#1
这个问题很可能是由于您的代码引入了分段错误这一事实而引起的,这一壮举通常在编译时不会被识别,因此为什么一些在线编译器可能没有抱怨,因为它是运行时错误,尽管如此,软件存在通过各种过程来确定此类错误,这远远超出了这个问题的范围(更现代的编译器包括此功能, 这就是为什么我指定在编译时通常不会发现此类错误,尤其是在处理较旧的和遗留的技术(如 C)时;因此,就目前而言,重要的是要知道大多数现代 IDE 都使用这些工具,并且它们会模仿效果,或者更确切地说,它们会预测运行代码的副作用。
现在回到实际错误,在从第 59-72 行开始的 while 循环中,您似乎省略了检查 prevPtr 是否为 NULL,如果是 NULL,则取消引用 NULL,这是不允许的操作。
while(currPtr != NULL){
if(currPtr->data == data){
Node *tempPtr = currPtr;
if(prevPtr != NULL){
prevPtr->next = currPtr->next;
}
else{
*head = currPtr->next;
}
currPtr = currPtr->next;
free(tempPtr);
}
else{
prevPtr = currPtr;
currPtr = currPtr->next;
}
}
if (currPtr == NULL && prevPtr != NULL) {
prevPtr->next = NULL;
}
评论
0赞
Grinza
10/19/2023
谢谢,但它还是在 free() 时冻结了
0赞
10/19/2023
此外,当目标是列表的最后一个节点/单元格时,可能会出现问题。让我知道这是否是一个问题,或者这段代码是否对您有所帮助,以便万一它没有按预期工作,我可以根据您遇到的其他情况更新答案。
0赞
10/19/2023
为了安全起见,我修改了代码以确保如果要删除最后一个节点时不会出现问题,请告诉我冻结是否仍然存在,如果是这样,我建议至少尝试直接在终端中使用编译器运行它,看看它是否解决了删除问题, 因为如果它确实如此并且编译器没有抱怨,这可能意味着问题出在 VS Code 而不是代码上。
0赞
Grinza
10/19/2023
是的,冻结持续存在
评论
data