Поврежденная ошибка кучи c - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь создать дерево из вектора родителей. Однако я получаю «ошибку поврежденной кучи» при создании узлов с помощью malloc. Он работает для первых двух дочерних элементов, однако вылетает на третьем (или завершается, но не связывает корень с дочерним элементом).

Необработанное исключение в 0x77E8A879 (ntdll.dll) в lab7.exe: 0xC0000374: Куча была повреждена (параметры: 0x77EC5910).

Я реализовал это, сначала извлекая корень и создавая узел, а затем извлекая дочерние элементы корня и создавая их.

search root-> ищет корень и возвращает его значение. функция, которая ищет детей (ключ поиска)

void create-> Функция, которая создает дочерние элементы. Я отправляю вектор, который содержит только детей этого конкретного родителя, а не других детей.

 *typedef struct  node
    {
        int value;
        node *left;
        node *right;
        node *middle;
    }TreeNodeParent;
    int search_root(int in[9])
    {
        for (int i = 0; i < 9; i++)
        {
            if (in[i] == -1)
            {
                int var = i+1;
                in[i] = -2;
                return var;
            }// pe else nu facem nimic
        }
        return -2; 
    }
    int search_key(int in[9], int  radacina)
    {
        for (int i = 0; i < 9; i++)
        {
            if (in[i] == radacina)
            {

                int var = i + 1;
                in[i] = -2;
                return var;
            }
        }
        return -3;
    }
    TreeNodeParent *createOneNode(int value)
    {
//the error appears here
        TreeNodeParent* create = (TreeNodeParent*)malloc(sizeof(TreeNodeParent));
        create->value = value;
        create->left = create->middle = create->right = NULL;
        return create;
    }

    void create(int vector[], TreeNodeParent* radacina)
    {
        for (int i = 0; i < 9; i++)
        {
            if (vector[i] == -3)//am stabilit ca -3 ii oprirea
            {
                break;
            }
            else
            {
                TreeNodeParent* create = createOneNode(vector[i]);

                if (radacina->left == NULL)
                {
                    radacina->left = create;
                }
                else if (radacina->middle == NULL)
                {
                    radacina->middle = create;
                }
                else 
                {
                    radacina->right = create;
                }
            }
        }
    }
    int main()
    {
        int input[9] = { 2,7,5,2,7,7,-1,5,2 };
        int root = search_root(input);
        if (root == -2)
        {
            printf("Nu gasim radacina, arbore incorect!");
        }
        else { printf("root %d", root); }

        //crearea nodului parinte
        TreeNodeParent* rootParent = (TreeNodeParent*)malloc(sizeof(TreeNodeParent*));
        rootParent->value = root;
        rootParent->left = NULL;
        rootParent->right = NULL;
        rootParent->middle = NULL;
        int vect2[9];
        for (int i = 0; i < 9; i++)//worst case, tot arborele is copii ai lui root->o(n2)
        {
             vect2[i] = search_key(input, root);
             printf("copii rootului %d", vect2[i]);
            if ( vect2[i] == -3)
            {
                break;
            }
        }   
        create(vect2,rootParent);
        _getch();
        return 0;
    }

проверил онлайн с помощью gdb:

>     tin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((ol
>     d_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed.
program exited
> with code 134

Я не могу понять, почему функция падает только на третий (и не раньше). Также это не всегда появляется. Иногда работает нормально, иногда останавливается с этой ошибкой. Также, если есть лучший способ создать дерево с родительским представлением?

1 Ответ

0 голосов
/ 04 мая 2018

Я думаю, что проблема в вашем main() методе, где вы malloc() с sizeof(TreeNodeParent*) вместо sizeof(TreeNodeParent) и присваиваете rootParent:

//crearea nodului parinte
//TreeNodeParent* rootParent = (TreeNodeParent*)malloc(sizeof(TreeNodeParent*));
TreeNodeParent* rootParent = (TreeNodeParent*)malloc(sizeof(TreeNodeParent));      `
...