我遇到了一个很奇怪的问题,可能是微不足道的,但我找不到原因:我在链表上写了一些标准函数,特别是当我执行元素删除函数时,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条答案
按热度按时间brgchamk1#
这个问题很可能是由于你的代码引入了一个分段错误,这是一个在编译时通常无法识别的壮举,因此为什么一些在线编译器可能没有抱怨,因为它是一个运行时错误,尽管如此,软件存在通过各种过程来确定这种错误,这些过程远远超出了这个问题的范围。(更现代的编译器包括这个功能,这就是为什么我指定这样的错误通常不会在编译时发现,特别是在处理旧的和遗留的技术时,如C);因此,现在重要的是要知道,大多数现代IDE都使用这些工具,并且它们模拟了这些效果,或者说,它们预测了运行代码的副作用。
现在回到实际的错误,在59-72行的while循环中,你似乎忽略了检查是否是NULL,如果是NULL,你只是解引用NULL,这是不允许的操作。
字符串