2016-02-06 1 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.Ошибка Malloc при вставке элемента в красное черное дерево

Использование GDB: Когда я использую gdb, я обнаружил, что как только я создал первый узел (корень дерева), когда я вхожу в вставку второго элемента, то есть 5, строка ptr-> left = create_node (elem) перенаправляет на функцию create_node(). Адрес, выделенный для 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.

Теперь я должен изменить этот адрес в памяти, выделяемой таНос (? Если да, то как) или есть другие проблемы в коде ?

+0

Не набрасывайте результат 'malloc' & friends в C. – 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

Смежные вопросы