Теряется указатель [закрыт]

135
18 декабря 2020, 06:20
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

Закрыт 1 год назад.

Улучшить вопрос
// Алфавит
const char alphabet[] = { 'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '@', '$', '!', '?', '*' };

// Проверка равенства строк
bool smp_local(const char* str1, const char* str2) {
    return (strcmp(str1, str2) == 0);
}

// Создание дерева
struct tree* DB_Create() {
    struct tree* res = (new (struct tree));
    res->root = NULL;
    return res;
}

// Создание листа
struct leaf* Leaf_Create(char login[257], char pass[257], bool ring) {
    struct leaf* Leaf = new (struct leaf);
    strcpy_s(Leaf->login, login);
    strcpy_s(Leaf->pass, pass);
    Leaf->next = NULL;
    Leaf->ring = ring;
    for (int i = 0; i < 256; i++) Leaf->SessionID[i] = alphabet[GenerateRandom(0, 66)];
    Leaf->SessionID[256] = 0;
    return Leaf;
}

// Проверка на пустоту
bool DB_IsEmpty(struct tree* Tree) {
    return (Tree->root == NULL);
}

// Добавить лист (доп. функция к нижней)
void DB_AddUser_leaf(char login[257], char pass[257], struct leaf* Leaf, bool ring) {
    if (Leaf == NULL) Leaf = Leaf_Create(login, pass, ring);
    else DB_AddUser_leaf(login, pass, Leaf->next, ring);
}

// Добавить лист
void DB_AddUser(char login[257], char pass[257], struct tree* Tree, bool ring) {
    if (DB_IsEmpty(Tree)) Tree->root = Leaf_Create(login, pass, ring); else
        DB_AddUser_leaf(login, pass, Tree->root, ring);
}

Почему при добавлении листа (последняя функция) Tree-> root заполняется, а вот все сыновья Tree->root->next и т.д. нет (остаются NULL)

Answer 1

У вас во всем коде нет ни одного места, где бы указателям ->next назначались ненулевые значения. Почему вас удивляет, что указатели ->next остаются нулевыми?

У вас есть присваивание для Tree->root в функции DB_AddUser. Поэтому неудивительно, что Tree->root у вас получается ненулевой. А ->next у вас нигде не присваивается вообще.

В функции DB_AddUser_leaf ветка Leaf = Leaf_Create(login, pass, ring); просто делает утечку памяти. Leaf наружу никак не передается и его значение просто теряется по завершении функции. То есть функция DB_AddUser_leaf ничего полезного не делает. Она только генерирует утечки памяти.

P.S. Вы уже, по-моему, в который раз задаете вопрос с разными вариациями одной и тот же ошибки (Использование fopen_s в внешней функции).

READ ALSO
Размер указателя на функцию

Размер указателя на функцию

Пусть имеется банальный код:

122
Деструктор в контейнерах?

Деструктор в контейнерах?

Допустим, есть класс:

126
Вставка Watermark в поток печати

Вставка Watermark в поток печати

Microsoft говорит нам, что мы можем модифицировать поток печати посредством разработки плагинов для драйвера печати

106