c - 尝试分配内存时的 sysmalloc

标签 c tree

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/

相关文章:

使用可变数量的参数调用 exec?

C 数据结构错误

tree - 树描述的语法示例(lex/yacc)

java - 用java表示树的层次结构

CAN总线过滤器和屏蔽逻辑

c - 如何使用 VS11 在 C 程序中嵌入和使用资源文件?

c - 长十六进制 Linux 上的按位运算 C

java - 返回有 2 个子节点的节点数

java - 使用java在树中添加多个子节点

c++ - 如何将四面体树结构复制到CUDA设备内存?