我用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);
答案 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 *
要完全清楚时又有什么意义呢?