C, Ошибка сегментации в связанном списке - PullRequest
0 голосов
/ 03 июля 2018

У меня проблема с нижеприведенной функцией, когда (*ptr) равен NULL вместо завершения цикла while, функция завершается сбоем. Я пытался использовать if((*ptr)->next==NULL) break;, но все равно не получается.

boolean search_times(struct list ** ptr, float *V, int n, struct list_times ** new ){

    struct list * tmp_ptr=NULL;

    if( V!=NULL && n>=0 ) {
        while((*ptr)!=NULL) {

            int times=0;

            for (int i = 0; i < n; i++) {
                if (isequal((*ptr)->value, V[i]))
                    times++;
            }

            if((suf_insert_times(new, (*ptr)->value, times))==FALSE)
                return FALSE;

            tmp_ptr=*ptr;
            ptr=&(*ptr)->next;
            free(tmp_ptr);
        }
        return TRUE;
    }
    else
        return FALSE;
}

1 Ответ

0 голосов
/ 03 июля 2018

ptr=&(*ptr)->next; сохраняет указатель на член next объекта, который освобождается в следующей строке. Попытка разыменования ptr в следующей итерации приведет к неопределенному поведению.

*ptr = (*ptr)->next; должно быть правильно. Это продвинет список к следующему элементу, в то время как предыдущий будет освобожден в следующей строке.

...