C 删除第一个节点时第二次调用的分段错误
我有这个函数来删除某个节点,然后循环它,直到从列表中删除所有具有该值的节点 但是,当我尝试删除第一个节点时,第二次调用会导致分段错误。它适用于列表的其他部分 下面是我正在调用的删除节点的函数:C 删除第一个节点时第二次调用的分段错误,c,linked-list,segmentation-fault,C,Linked List,Segmentation Fault,我有这个函数来删除某个节点,然后循环它,直到从列表中删除所有具有该值的节点 但是,当我尝试删除第一个节点时,第二次调用会导致分段错误。它适用于列表的其他部分 下面是我正在调用的删除节点的函数: int delete(char* value, char* attribute, int attr_count){ dataContainer = datadata; dataList *temp, *prev; temp = dataContainer; prev =
int delete(char* value, char* attribute, int attr_count){
dataContainer = datadata;
dataList *temp, *prev;
temp = dataContainer;
prev = NULL;
int g = 0;
while(g < attr_count){
if(strlen(dataContainer->attributes[g]) == 0){
break;
}
if(!(strcmp(attribute, dataContainer->attributes[g]))){
break;
}
g++;
}
while(temp){
if(!(strcmp(temp->values[g], value))){
if(prev == NULL) {
dataContainer = temp->prev;
}else{
prev->prev = temp->prev;
}
free(temp);
return 1;
}
temp = dataContainer;
prev = temp;
temp = temp->prev;
}
return 0;
}
你可以在评论中看到我的解释: 第二次调用datadata指向任何对象,因为tmp在删除tmp时被释放,所以您应该像下面这样更新datadata=tmp->next
while(temp){
if(!(strcmp(temp->values[g], value))){
if(prev == NULL) {
//when dataContainer->prev == NULL - you are in the head
dataContainer = temp->prev;
// if prev means previous in this case:
// dataContainer = NULL, on the second call segmentation fault appears when calling starting from line dataContainer->attributes[g]
}else{
prev->prev = temp->prev;
}
有关datacontainer和dataList结构的更多信息以及了解datadata的来源都会有所帮助。在调用delete之前是否验证了数据结构有效?dataList是一个具有char**属性和值的结构。以及上一个和下一个指针。dataContainer和datadata是dataList类型的全局变量。@KarolyHorvath是。我尝试打印整个列表,但内容没有错误。attr_count对所有节点都有效吗?访问值[attr_count]有效吗?