Сохранение строки в C для дерева AVL

У меня есть проект, который требуется для хранения двух переменных для дерева AVL: слова и скорости его использования:

struct AVLnodo {
  float peso;
  int FB;
  char *palavra;
  struct AVLnodo* esq;
  struct AVLnodo* dir;
};

Примечание.

песо=коэффициент использования

palavra=слово

другие переменные являются указателями на дочерние элементы и коэффициенты баланса.

Проблема в коде ниже:

wordTree* InsereAVL (wordTree *a, float peso, char *word, int *ok)
{
if (a == NULL)
  {
     a = (wordTree*) malloc(sizeof(wordTree));
     a->peso = peso;
     a->palavra = NULL;

     //1----->  strcpy(a->palavra,word);
     //2----->  a->palavra=word;

     a->esq = NULL;
     a->dir = NULL;
     a->FB = 0;
     *ok = 1;
 }
 else
 if (peso < a->peso)
 {
       ...
 }
 else
 {
       ...
 }
 return a;
}

Правильный способ скопировать строку — использовать strcpy, как показано цифрой 1, но это приводит к ошибке выполнения.

При использовании 2 код работает, но поле слова в структуре каждого узла хранится с одним и тем же адресом, т. е. все узлы имеют разные числа в песо (коэффициент использования), но одно и то же слово в палавре (слово), которое является последним словом, добавленным к дереву.

Я не знаю, как решить эту проблему. Надеюсь, кто-нибудь знает, как это исправить.

Спасибо.


person Mateus Heck    schedule 27.07.2017    source источник
comment
a->palavra = NULL; strcpy(a->palavra,word); плохо. Для a->palavra не выделена память. Предложите a->palavra = strdup(word);. Вы несете ответственность за free(a->palavra) позже.   -  person Weather Vane    schedule 27.07.2017
comment
Правильный способ скопировать строку — использовать strcpy Yes, но скопировать ее где? Вам нужна память, чтобы сначала сохранить копию, и она не растет на деревьях (AVL).   -  person n. 1.8e9-where's-my-share m.    schedule 27.07.2017
comment
Я думал, что использование a = (wordTree*) malloc(sizeof(wordTree)); также выделит память для строки, теперь исправил это. Спасибо   -  person Mateus Heck    schedule 27.07.2017
comment
Кто или какой текст предложил привести результат malloc()?   -  person chux - Reinstate Monica    schedule 27.07.2017
comment
@chux, это вредно или просто не нужно? Я думаю, что wordTree* совместим с void*.   -  person Laposhasú Acsa    schedule 27.07.2017
comment
@LaposhasúAcsa См. Можно ли привести результат malloc?.   -  person chux - Reinstate Monica    schedule 27.07.2017
comment
Возможный дубликат Как скопировать строку с помощью указателя   -  person too honest for this site    schedule 28.07.2017


Ответы (2)


Вам нужно выделить память перед копированием слова:

a->palavra = malloc(strlen(word)+1);

person Bogolt    schedule 27.07.2017
comment
Я сделал это, и это сработало! Я использовал a = (wordTree*) malloc(sizeof(wordTree));, думал, что он также выделит память для строкового поля, спасибо за помощь! - person Mateus Heck; 27.07.2017
comment
malloc(sizeof(wordTree)); выделяет достаточно памяти для вашей структуры. Указатели представляют тип, отличный от типа, на который они ссылаются. Обратите внимание, что размер указателя может отличаться в разных архитектурах. - person Laposhasú Acsa; 27.07.2017

Я думаю, вам нужно выделить память, прежде чем использовать strcpy для a->palavra.

person Laposhasú Acsa    schedule 27.07.2017