#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 );