У меня есть проект, который требуется для хранения двух переменных для дерева 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 код работает, но поле слова в структуре каждого узла хранится с одним и тем же адресом, т. е. все узлы имеют разные числа в песо (коэффициент использования), но одно и то же слово в палавре (слово), которое является последним словом, добавленным к дереву.
Я не знаю, как решить эту проблему. Надеюсь, кто-нибудь знает, как это исправить.
Спасибо.
a->palavra = NULL; strcpy(a->palavra,word);
плохо. Дляa->palavra
не выделена память. Предложитеa->palavra = strdup(word);
. Вы несете ответственность заfree(a->palavra)
позже. - person Weather Vane   schedule 27.07.2017a = (wordTree*) malloc(sizeof(wordTree));
также выделит память для строки, теперь исправил это. Спасибо - person Mateus Heck   schedule 27.07.2017malloc()
? - person chux - Reinstate Monica   schedule 27.07.2017