VS代码在C中停留在free()

6jjcrrmo  于 2023-11-17  发布在  其他
关注(0)|答案(1)|浏览(143)

我遇到了一个很奇怪的问题,可能是微不足道的,但我找不到原因:我在链表上写了一些标准函数,特别是当我执行元素删除函数时,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;
    }
}

}

字符串
“错误”截图:


的数据
这很奇怪,因为它的行为就像我在那一点上放了一个断点,但事实并非如此,所以我不明白它可能依赖于什么。

brgchamk

brgchamk1#

这个问题很可能是由于你的代码引入了一个分段错误,这是一个在编译时通常无法识别的壮举,因此为什么一些在线编译器可能没有抱怨,因为它是一个运行时错误,尽管如此,软件存在通过各种过程来确定这种错误,这些过程远远超出了这个问题的范围。(更现代的编译器包括这个功能,这就是为什么我指定这样的错误通常不会在编译时发现,特别是在处理旧的和遗留的技术时,如C);因此,现在重要的是要知道,大多数现代IDE都使用这些工具,并且它们模拟了这些效果,或者说,它们预测了运行代码的副作用。
现在回到实际的错误,在59-72行的while循环中,你似乎忽略了检查是否是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;
}

字符串

相关问题