【问题标题】:Segmentation fault on second call when deleting first node删除第一个节点时第二次调用出现分段错误
【发布时间】:2015-11-18 13:40:05
【问题描述】:

我有这个删除某个节点的函数,然后我循环它直到所有具有该值的节点都从列表中删除。

但是,当我尝试删除第一个节点时,会导致第二次调用出现分段错误。它适用于列表的其他部分。

这是我为删除节点而调用的函数:

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;

}

【问题讨论】:

  • 更多关于datacontainer 和dataList 结构的信息以及了解datadata 的来源会有所帮助。
  • 在调用delete之前,您是否验证数据结构有效?
  • dataList 是一个具有char** 属性和值的结构。以及指针 prev 和 next。 dataContainer 和 datadata 是 dataList 类型的全局变量。
  • @KarolyHorvath 是的。我尝试打印整个列表,其内容没有错误。
  • attr_count 对所有节点都有效吗?访问values[attr_count] 有效吗?

标签: c linked-list segmentation-fault


【解决方案1】:

你可以在cmets中看到我的解释:

在第二次调用 datadata 点时,因为 tmp 在 delete tmp 时被释放,你应该像这样更新 datadata 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;
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多