C中的单个链接列表(指针,首先删除,为什么我必须单独保留数据?)


    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;
}

(对不起,英语不好,我做到了(

 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); 

so,您不是在释放其值存储在 value而不是列表中的下一个指针的指针。当您将*ptrptr指向下一个指针时(或列表中的下一个节点(。

相关内容

最新更新