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
指向下一个指针时(或列表中的下一个节点(。