sysmalloc при попытке выделить память - PullRequest
0 голосов
/ 05 апреля 2019

Я написал программу на c, которая создает корень дерева и добавляет узел к левому потомку корня, но каким-то образом, когда я пытаюсь выделить память для дочернего узла, я получаю

sysmalloc: утверждение `(old_top == initial_top (av) && old_size == 0) ||((unsigned long) (old_size)> = MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 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;
}

functions.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;

functions.h

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

1 Ответ

3 голосов
/ 05 апреля 2019

Вы не выделяете достаточно места в BTCreate(). sizeof(BTNode) - это размер указателя, а не размер treenode структуры. Должно быть:

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

или

BTNode root = malloc(sizeof(TREENODE));

Общее правило состоит в том, что аргумент типа для sizeof() в вызове malloc() должен , а не совпадать с типом переменной, которую вы назначаете. Это должен быть тип, на который указывает указатель, т. Е. Он должен иметь на один * меньше, чем тип переменной, или вы можете использовать *variable для ссылки на значение, на которое он указывает.

Также часто бывает плохой идеей указывать указатели. См. Это хорошая идея, чтобы печатать указатели? . Имя, которое вы использовали, BTNode, является хорошим примером путаницы, которую оно вызывает; Вы называете это «узлом», но на самом деле это не узел, это указатель на узел. Вы должны использовать имя типа BTNodePtr, но какой смысл в этом, когда вы можете просто сказать TREENODE *, чтобы быть совершенно ясным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...