在释放我创建的树结构时遇到了一个大问题。 这是树形结构:
typedef struct arbre{
char valeur;
struct arbre * lienVertical;
struct arbre * lienHorizontal;
}cellule;
这是我用来分配内存的函数:
cellule * creationCellule()
{
cellule * nouveau = (cellule *)malloc(sizeof(cellule));
if(nouveau != NULL)
{
nouveau->lienHorizontal = NULL;
nouveau->lienVertical = NULL;
}
return nouveau;
}
然后,我创建此函数以在链接列表中排列指针,在该列表中调用上述函数进行分配:
cellule *allocationCellule(cellule **prec, char c , int j)
{
cellule *copy = (*prec);
if( j == 0)
{
*prec = creationCellule();
(*prec) -> valeur = c;
(*prec) -> lienHorizontal = copy;
(*prec) -> lienVertical = NULL;
}
else
{
*prec = creationCellule();
(*prec) -> valeur = enMajuscule(c);
(*prec) -> lienHorizontal = copy;
(*prec) -> lienVertical = NULL;
}
return *prec;
}
最后是在树中插入的位置:
void insertion(cellule ** tete, char * nomFichier)
{
int i;
int j;
cellule **prec = NULL;
char lco[50];
char *mot = lco;
FILE *fichier = fopen(nomFichier,"r");
if (fichier != NULL) {
while(fscanf(fichier,"%s",mot) != -1)
{
prec = recherche(tete, mot, &i);
if(*(mot + i +1) == '\0' && (*prec) != NULL && (*prec)->valeur <= (*mot + i))
{
(*prec) -> valeur = enMajuscule((*prec) -> valeur);
}
else{
mot = mot + i;
while (*mot != '\0' )
{
if(*(mot + 1) == '\0')
{
j = 1;
(*prec) = allocationCellule(prec, (*mot) , j);
}
else
{
j = 0;
(*prec) = allocationCellule(prec, (*mot) , j);
}
prec = &((*prec) -> lienVertical);
mot = mot + 1;
i = 0;
}
}
}
}
fclose(fichier);
}
产生问题的函数是释放整个树的函数:
void libererArbre(cellule **tete)
{
cellule ** cour = tete;
cellule *tmp = (*cour);
int fin = 0;
pile_t *pile;
pile = initialisationPile(50);
while (fin == 0)
{
while((*cour) != NULL)
{
empiler((*cour), pile);
(*cour) = (*cour)->lienVertical;
}
if (!estVidePile(pile))
{
tmp = depiler(pile);
(*cour)= tmp->lienHorizontal;
free(tmp);
}
else
{
fin = 1;
}
}
libererPile(pile);
}
结构的头已初始化并按如下方式使用:
cellule *tete;
cellule ** t = &tete;
valgrind说: free()无效的指针 已终止,核心已丢弃
如果您能帮助我,我将不胜感激