在红黑树中插入元素时出现Malloc错误

时间:2016-02-06 13:08:20

标签: c malloc

#include<stdio.h>
#include<stdlib.h>
typedef struct treenode{
    int elem;
    int color;
    struct treenode *left,*right,*parent;
}treenode_t;
treenode_t *create_node(int elem){
    treenode_t *newnode=(treenode_t *)malloc(sizeof(treenode_t *));
    newnode->elem=elem;
    newnode->left=NULL;
    newnode->right=NULL;
    newnode->color=0;
    newnode->parent=NULL;
    return newnode;
}
void insert(treenode_t **node,int elem){
    if(*node==NULL){
        *node=create_node(elem);
    }else{
        treenode_t *store_parent;
        treenode_t *ptr;
        ptr=*node;
        while(ptr!=NULL){
            store_parent=ptr;
            if(elem<ptr->elem){
                if(ptr->left==NULL){
                    ptr->left=create_node(elem);
                    (ptr->left)->parent=store_parent;
                    (ptr->left)->color=1;
                }
                ptr=ptr->left;
            }
            else if(elem>ptr->elem){
                if(ptr->right==NULL){
                ptr->right=create_node(elem);
                (ptr->right)->parent=store_parent;
                (ptr->right)->color=1;
                }
                ptr=ptr->right;
            }
        }
    }
}
void print_tree(treenode_t *node){
    if(node==NULL)
        return;
    print_tree(node->left);
    printf("%d\n",node->elem);
    print_tree(node->right);
}
void main(){
    treenode_t *root=NULL;
    insert(&root,10);
    insert(&root,5);
    insert(&root,14);
    print_tree(root);
}

我可以插入第一个元素,但第二次malloc失败。

使用GDB: 当我使用gdb时,我发现一旦我创建了第一个节点(树的根),当我去插入第二个元素,即5行ptr-&gt; left = create_node(elem)重定向到函数create_node() 。分配给malloc的地址与存储在root中的地址相同,导致错误。

我收到以下错误:

  

a.out:malloc.c:2372:sysmalloc:断言`(old_top ==(((mbinptr)(((char *)&amp;((av) - &gt; bins [((1) - 1) * 2])) - __builtin_offsetof(struct malloc_chunk,fd))))&amp;&amp; old_size == 0)|| ((unsigned long)(old_size)&gt; =(unsigned long)(((__ builtin_offsetof(struct malloc_chunk,fd_nextsize))+((2 *(sizeof(size_t))) - 1))&amp;〜((2 * (sizeof(size_t))) - 1)))&amp;&amp;((old_top) - &gt; size&amp; 0x1)&amp;&amp;((unsigned long)old_end&amp; pagemask)== 0)&#39;失败。

     

编程接收信号SIGABRT,已中止。   __GI_raise中的0x00007ffff7a4af79(sig = sig @ entry = 6)       在../nptl/sysdeps/unix/sysv/linux/raise.c:56   56 ../nptl/sysdeps/unix/sysv/linux/raise.c:没有这样的文件或目录。

现在我必须更改malloc分配的内存地址(如果是,如何?)或者代码中是否还有其他问题?

1 个答案:

答案 0 :(得分:1)

我认为问题是您用{:1}}调用的参数:

malloc

你要求记忆,但我认为你的要求不够。 treenode_t *newnode=(treenode_t *)malloc(sizeof(treenode_t *)); 指针的大小返回给sizeof(treenode_t *);你需要的是整个结构的足够空间。请尝试使用treenode_t,看看是否有帮助。