免费的无效指针核心转储

时间:2019-05-28 19:19:37

标签: c pointers free

在释放我创建的树结构时遇到了一个大问题。 这是树形结构:

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()无效的指针 已终止,核心已丢弃

如果您能帮助我,我将不胜感激

0 个答案:

没有答案