sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. Aborted (core dumped)
即使我没有调用函数 free()
。
我正在使用 gcc 编译器。
主.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;
}
功能.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;
}
类型.h
typedef char BTItem;
struct treenode{
BTItem item;
struct treenode *left;
struct treenode *right;
struct treenode *parent;
};
typedef struct treenode TREENODE;
typedef TREENODE *BTNode;
功能.h
BTNode BTCreate();
BTNode BTInsertLeft(BTNode node,BTItem item);
最佳答案
您没有在 BTCreate()
中分配足够的空间。 sizeof(BTNode)
是指针的大小,而不是 treenode
结构的大小。应该是:
BTNode root = malloc(sizeof(*root));
或
BTNode root = malloc(sizeof(TREENODE));
一般规则是 malloc()
调用中 sizeof()
的类型参数应该不与类型相同你分配给的变量。它应该是指针指向的类型,即它应该比变量的类型少一个 *
,或者你可以使用 *variable
来引用它的值指向。
typedef 指针通常也是一个坏主意。参见 Is it a good idea to typedef pointers? .您使用的名称 BTNode
是它引起混淆的一个很好的例子;你称它为“节点”,但它实际上不是节点,它是指向节点的指针。您应该使用像 BTNodePtr
这样的名称,但是当您只说 TREENODE *
就很清楚时,这样做有什么意义呢?
关于c - 尝试分配内存时的 sysmalloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55542672/