Как освободить древовидную структуру в Си с двойным указателем - PullRequest
0 голосов
/ 27 мая 2019

Я делаю код о построении древовидной структуры в C, которая не является двоичной. Структура содержит горизонтальную, вертикальную ссылку и значение символа. Сейчас я пытаюсь освободить каждую структуру, выделенную для построения этого дерева, но valgrind дает мне ошибку. Я использую двойной указатель, чтобы указать на голову дерева. В функции стопка означает стек, поэтому я складываю каждый узел вертикально, а затем ищу горизонтальные. Я привожу в качестве примера пример дерева, его структуры и результата валгринда Можете ли вы помочь мне понять, что не так, потому что я не понимаю? Спасибо !

void libererArbre(cellule ** tete)
{
    cellule * cour = * tete;
    cellule ** temp = &cour; 
    pile_t * pile;
    pile = initialisationPile(TAILLE_PILE);
    int fin = 0;    
    while(fin == 0)
    {   
        while(cour != NULL)
        {
            empiler(cour, pile);
            //printf("empilimi %c\n", cour->valeur);
            cour = cour->lienVertical;
        }
        if(!estVidePile(pile))
        {
            cour = depiler(pile);
            //printf("depilimi %c\n", cour->valeur);
            temp = &cour;
            free(temp);
            cour = cour->lienHorizontal;    
        }
        else
        {
            fin = 1;
            printf("a futet ne fin 1 apo jo \n");
        }
    }
    libererPile(pile);
}

Вот изображение результата valgrind:

enter image description here

Вот изображение объяснения структуры:

enter image description here

1 Ответ

0 голосов
/ 27 мая 2019

Проблема с этими двумя строками:

        temp = &cour;
        free(temp);

Поскольку cour является локальной переменной, temp будет указывать на этот адрес стека. Когда вы звоните free(temp), вы пытаетесь освободить адрес памяти, который не был выделен с malloc.

Вам, вероятно, нужно сделать что-то вроде

        temp2 = cour;
        cour = cour->lienHorizontal;    
        free(temp);

(где temp2 объявлен как cellule *temp2), но это невозможно узнать, не увидев ваш код распределения.

...