boolean consume_first(struct list ** ptrptr, float * value){

    struct list * temp;
    if((*ptrptr) != NULL){
        *value = (*ptrptr)->data; //HERE
        temp = (*ptrptr);
        *ptrptr = (*ptrptr)->next;
        free(temp); //and HERE

        return TRUE;
    }else{
        return FALSE;
    }
}

ЗДЕСЬ (в коде)

Как только я использую "бесплатно", данные тоже стираются, или нет?

«Программа» не предназначена для работы, я вызвал и передал аргументы с единственной целью - «реализовать» ее позже.

ОСНОВНЫЕ И ДРУГИЕ ВЕЩИ:

struct list{
    float data;
    struct list * next;
};

void init(struct list**);
void visit(struct list*);
int get_value(float*);
void pre_insert(struct list**, float*);
boolean consume_first(struct list**, float*); //HERE
void suf_insert(struct list **, float*);

int main(){

    struct list * listA;
    struct list * listB;

    init(&listA);
    init(&listB);

    float * data = NULL;
    *data = get_value(data);

    pre_insert(&listA, data);
    pre_insert(&listB, data);

    visit(listA);
    visit(listB);

    consume_first(&listA, &listA->data); //HERE
    consume_first(&listB, &listB->data); //HERE

    suf_insert(&listA, data);
    suf_insert(&listB, data);



    return 0;
}

(извините за плохой английский, я постарался)

0
AlexanderWalls 27 Фев 2018 в 07:22

1 ответ

Лучший ответ
 free(temp);

Поскольку temp указывает на *ptrptr, следовательно, выше будет освобождена память, выделенная для *ptrptr. После освобождения доступ к данным с помощью *ptrptr будет некорректным.

Однако это не повлияет на данные, хранящиеся в *value.

*value = (*ptrptr)->data; 

Это происходит перед оператором free, а также данные сохраняются в ячейке памяти, указанной указателем value. Он останется в силе и может быть использован.

Также обратите на это внимание (возможно, вы знаете, но) -

temp = (*ptrptr);
*ptrptr = (*ptrptr)->next;       // *ptrptr points to next pointer in list now
free(temp); 

Итак, вы освобождаете не указатель, значение которого хранится в value, а следующий указатель в списке. Когда вы заставляете *ptrptr указывать на следующий указатель (или следующий узел в списке).

2
ameyCU 27 Фев 2018 в 08:14