sysmalloc: Утверждение …… не удалось. Прервано (ядро сброшено)

#arrays #c #tree #malloc #implicit-conversion

Вопрос:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>



typedef struct a{ 
    char * word ;
    int occurs;
    struct a * left;
    struct a * same;
    struct a * right; } Node; 
    
typedef Node * Node_ptr ;
typedef Node * TriTree ;

void inorder(TriTree x) {
    if(x==NULL) return;
    inorder(x->left);
    printf("%s(%d)--" , x->word, x->occurs);
    inorder(x->same);
    inorder(x->right);
    return;}

void strlower(char * lower){
    for (char *p = lower; *p;   p) *p = tolower(*p);
    printf("%sn",lower);
};
// 1
Node_ptr create(char * word){
    Node_ptr tmp_ptr;
    tmp_ptr = (Node_ptr)malloc(sizeof(Node_ptr));
    tmp_ptr-> word = word;
    tmp_ptr-> occurs = 1;
    tmp_ptr-> left = NULL;
    tmp_ptr-> same = NULL;
    tmp_ptr-> right = NULL;
    return tmp_ptr;
}


int main()
{
    char a[]="Stelios";

    strlower(amp;a);

    Node_ptr tmp;
    
    tmp = create(amp;a);
    printf(tmp->word);
    return 0;
}
 

Я хочу написать структуру о троичном дереве и методах создания узлов, вставки узлов и т. Д.

Когда я запускаю этот код, как он есть, все в порядке! когда я комментирую строку // strlower(amp;a) в main (), я получаю ошибку о выделении памяти, но не могу ее идентифицировать. Используя Valgrind, я получаю неоднозначные результаты для его отладки. Можете ли вы помочь мне с этим конкретным фрагментом кода?

Комментарии:

1. tmp_ptr = (Node_ptr)malloc(sizeof(Node_ptr)); это явно неправильно.

2. Вы скрываете тип указателя за a typedef . Это срабатывает в ответ, когда вы используете этот тип для выделения памяти: malloc(sizeof(Node_ptr)); не скрывайте указатели в списках типов.

3. По крайней мере, gcc 11.1.1 явно предупреждает о нескольких ошибках в этом коде. Постарайтесь проявить некоторое усердие, прежде чем задавать вопросы по SO.

4. Я новичок в программировании на C, и меня вообще путали с указателями! Извините, что отнял у вас время, я должен был поискать больше! Но спасибо за руководство и добрые ответы!

Ответ №1:

Это выделение памяти

 tmp_ptr = (Node_ptr)malloc(sizeof(Node_ptr));
 

это неправильно. Вы пытаетесь выделить объем памяти неправильного размера.

Попробуй

 tmp_ptr = (Node_ptr)malloc(sizeof(Node));
 

или

 tmp_ptr = (Node_ptr)malloc(sizeof( *tmp_ptr ));
 

Также выражения аргументов в этих вызовах

 strlower(amp;a);
tmp = create(amp;a);
 

неверны. Вместо типа char * выражения имеют тип char ( * )[sizeof( a )] .

Тебе нужно написать

 strlower( a );
tmp = create( a );