2016-02-06 44 views
0
#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時發現,一旦我創建了第一個節點(樹的根),當我去插入第二個元素,即5行ptr-> left = create_node(elem)時,重定向到函數create_node()。分配給malloc的地址與存儲在導致錯誤的根中的地址相同。將元素插入紅黑樹時發生malloc錯誤

我收到以下錯誤:

a.out: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed.

Program received signal SIGABRT, Aborted. 0x00007ffff7a4af79 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.

現在我一定要改變地址由malloc的分配的內存中(?如果是,如何),或者是有一些其他問題的代碼?

+0

不要在C中投放'malloc'和朋友的結果。 – Olaf

回答

1

我認爲這個問題是您正在使用調用malloc與參數:

treenode_t *newnode=(treenode_t *)malloc(sizeof(treenode_t *)); 

你問的記憶,但我不認爲你要求不夠。 sizeof(treenode_t *)指針的大小返回至treenode_t;你需要的是整個結構足夠的空間。嘗試使用sizeof(treenode_t)來代替,看看是否有幫助。

+1

感謝Dude,它現在有效。 – Milan

+1

需要考慮的事項:[我是否投射了malloc的結果?](http://stackoverflow.com/a/605858/3204551) – Deduplicator