损坏的堆错误c

损坏的堆错误c,c,heap-corruption,C,Heap Corruption,我正在尝试从父向量创建一棵树。但是,当我使用malloc创建节点时,会出现“损坏的堆错误”。它适用于前两个子级,但在第三个子级崩溃(或终止,但不连接根和子级) lab7.exe中0x77E8A879(ntdll.dll)处未处理的异常:0xC0000374: 堆已损坏(参数:0x77EC5910) 我已经实现了这一点,首先提取根并创建节点,然后提取根的子节点并创建它们 搜索根->搜索根并返回其值。 搜索子项的函数(搜索键) void create->创建子项的函数。我发送一个向量,它只包含特定父

我正在尝试从父向量创建一棵树。但是,当我使用malloc创建节点时,会出现“损坏的堆错误”。它适用于前两个子级,但在第三个子级崩溃(或终止,但不连接根和子级)

lab7.exe中0x77E8A879(ntdll.dll)处未处理的异常:0xC0000374: 堆已损坏(参数:0x77EC5910)

我已经实现了这一点,首先提取根并创建节点,然后提取根的子节点并创建它们

搜索根->搜索根并返回其值。 搜索子项的函数(搜索键)

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;
    }
我不明白为什么函数只在第三天(而不是之前)崩溃。而且它并不总是出现。有时它工作正常,但有时会因该错误而停止。
还有,是否有更好的方法创建具有父表示的树

我认为问题出在您的
main()
方法中,您使用
sizeof(TreeNodeParent*)
而不是
sizeof(TreeNodeParent)
将其分配给
rootParent

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

这里有输入错误radacina->right==create;您可能希望它是radacina->right=create;是的,谢谢!但是createOneNode函数出现错误。那么问题不在发布的代码中。请同时提供堆栈或堆?它们是完全不同的东西。调用
free()
并导致程序崩溃时,您会注意到堆损坏。堆栈损坏将导致随机行为,并将由递归、堆栈溢出、失控代码或指针错误等引起。避免问题中的图像。以文本形式提供一些。使用所有警告和调试信息编译(因此
gcc-Wall-Wextra-g
with..)。改进代码以不获取警告。使用调试器(如)和动态堆分析工具(如)。你应该修改你的问题来改进它。我来看看,谢谢!但是,我不确定in-sizeof应该是(TreeNodeParent*)还是(TreeNodeParent)。
sizeof(TreeNodeParent*)
只是指向
TreeNodeParent
结构的指针的大小(4或8个字节,取决于您的体系结构),而不是整个结构的大小。例如
sizeof(int*)、sizeof(long*)
sizeof(TreeNodeParent*)
都是相同的。如果您喜欢整个结构的大小,请使用
sizeof(TreeNodeParent)
。感谢您澄清差异!
//crearea nodului parinte
//TreeNodeParent* rootParent = (TreeNodeParent*)malloc(sizeof(TreeNodeParent*));
TreeNodeParent* rootParent = (TreeNodeParent*)malloc(sizeof(TreeNodeParent));      `