尝试分配内存时使用sysmalloc

时间:2019-04-05 20:06:53

标签: c tree

我用c编写了一个程序,该程序创建树的根并在根的左子节点上添加一个节点,但是以某种方式尝试为子节点分配内存时得到

  

sysmalloc:断言`(old_top == initial_top(av)&& old_size == 0)|| (((无符号长)(old_size)> =最小大小&& prev_inuse(old_top)&&((无符号长)old_end&(页面大小-1))== 0)'失败。中止(核心已弃用)

即使我没有调用函数free()

我正在使用gcc编译器。

main.c

#include <stdio.h>
#include <stdlib.h>
#include "types.h"
#include "functionality.h"

int main(){
    BTNode root=NULL,tmp;

    root=BTCreate();

    BTInsertLeft(root,'c');
    return 0;
}

functionality.c

#include <stdio.h>
#include <stdlib.h>
#include "types.h"

BTNode BTInsertLeft(BTNode node,BTItem item){
    node->left=malloc(sizeof(BTNode));
    BTNode tmp=node->left;
    tmp->left=NULL;
    tmp->right=NULL;
    tmp->item=item;
    tmp->parent=node;
    return tmp;
}

BTNode BTCreate(){
    BTNode root=malloc(sizeof(BTNode));
    root->item='a';
    root->right=NULL;
    root->left=NULL;
    root->parent=NULL;
    return root;
}

types.h

typedef char BTItem;
struct treenode{
    BTItem item;
    struct treenode *left;
    struct treenode *right;
    struct treenode *parent;
};
typedef struct treenode TREENODE;
typedef TREENODE *BTNode;

functionality.h

BTNode BTCreate();
BTNode BTInsertLeft(BTNode node,BTItem item);

1 个答案:

答案 0 :(得分:3)

您没有在BTCreate()中分配足够的空间。 sizeof(BTNode)是指针的大小,而不是treenode结构的大小。应该是:

BTNode root = malloc(sizeof(*root));

BTNode root = malloc(sizeof(TREENODE));

一般规则是,在sizeof()调用中malloc()的类型参数应该 not 与您要分配的变量的类型相同。它应该是指针所指向的类型,即它应该比变量的类型少*,或者您可以使用*variable来引用它所指向的值。

typedef指针通常也是一个坏主意。参见Is it a good idea to typedef pointers?。您使用的名称BTNode是造成混乱的一个很好的例子。您将其称为“节点”,但实际上不是节点,而是指向节点的指针。您应该使用类似BTNodePtr的名称,但是当您只说TREENODE *要完全清楚时又有什么意义呢?

相关问题