我的程序管理结构的链表。
这是我的结构:
typedef struct wagon wagon;
typedef struct wagon{
wagon *next;
marchandise_ptr *liste;
double volume_courant;
}train_ptr;
其中wagon * next是指向链接列表的下一个“单元格”的指针,而marchandise_ptr * list是指向另一个链接列表的指针。要释放结构,请按照以下步骤操作:
在int main()中:
train_ptr *train=creer_un_train(...)//so train is the beginning of my linked list
liberer_train(&train);
我的职能是:
创建一个“货车”
wagon *creer_wagon(marchandise_ptr *liste,double volume_courant){ //it creates a wagon
assert(volume_courant>=0);
wagon *wag=malloc(sizeof(wagon));
if(wag==NULL)
return NULL;
wag->next=NULL;
wag->volume_courant=volume_courant;
wag->liste=liste;
return wag;
}
在链表的末尾添加创建的“旅行车”:
train_ptr *ajouter_wagon_a_la_fin_du_train(train_ptr *train,double volume_courant, marchandise_ptr *liste){
wagon *wag=creer_wagon(liste,volume_courant);
if(wag==NULL)
return NULL;
if(train==NULL)
train=wag;
else{
train_ptr *wag_current=train;
while(wag_current->next!=NULL)
wag_current=wag_current->next;
wag_current->next=wag;
}
return train;
}
创建火车:
train_ptr *creer_un_train(unsigned int nombre_de_wagons,marchandise_ptr *liste){
assert(nombre_de_wagons>=0);
int i;
train_ptr *train=NULL;
for(i=0;i<nombre_de_wagons;i++){
train=ajouter_wagon_a_la_fin_du_train(train,rand()%10,liste);
if(train==NULL)
return NULL;
}
return train;
}
免费搭乘火车:
void liberer_train(train_ptr **train){
train_ptr *p_current = *train;
while(p_current!=NULL){
*train = p_current->next;
p_current->next=NULL;
free(p_current->liste);
free(p_current);
p_current = *train;
}
}
P.S .: liste是指向链接列表的beginnig的指针:
typedef struct marchandise marchandise;
typedef struct marchandise{
double volume;
double volume_total;
char nom;
marchandise *suivant;
}marchandise_ptr;
感谢您的关注! (对不起我的英语,我不是母语人士。...:D)
最佳答案
从您的creer_wagon
函数看来,liste
函数似乎没有释放liberer_train
,因为它不是由creer_wagon
函数分配的。
按照这种逻辑,调用creer_wagon
的函数应该负责liste
成员,因为在调用者函数的范围内,您将有一个指向该函数的有效指针,并且可能会出现一个双重free
的风险。 liste
成员的名称。
如果每个train
只需要引用一个liste
而不需要修改它,则可以这样定义结构
typedef struct wagon{
wagon *next;
const marchandise_ptr *liste;
double volume_courant;
}train_ptr;
这样可以防止意外尝试修改或
free
liste
成员。这种设计在许多火车可以指向同一
liste
的情况下是有意义的,尽管它增加了struct wagon
用户的责任,因为他们应该照顾liste
成员的内存管理。如果是这种情况,我会双重推荐const
限定词。我认为这是推理
liste
是否由您分配的有效方法。我建议您像这样修复
liberer_train
函数void liberer_train(train_ptr **train) {
train_ptr *p_current = *train;
train_ptr *suivant = NULL;
while (p_current != NULL) {
suivant = p_current->next;
free(p_current);
p_current = suivant;
}
/* make the pointer NULL, so it's not a dangling pointer in the caller function anymore. */
*train = NULL;
}
而且,我建议你改变
typedef struct wagon train_ptr;
至
typedef struct wagon *train_ptr;
要么
typedef struct wagon train;
例如,因为后缀
_ptr
使人想到train_ptr x;
x
中的指针是指针,而实际上不是。关于c - 释放结构...我不确定是否做对了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27906984/