Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 04.01.2019
Сообщений: 23
1

Обнуление указателя после работы функции

05.08.2019, 01:23. Показов 4590. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Фрагмент кода:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
struct ZapDB{   //Структура записи БД
    char fio[32];   //символьный массив фио
    unsigned short int otdel;   //16-pазpядное положительное число - № отдела
    char dolzhn[22];    //символьный массив должность
    char dr[8]; //символьный массив ДР дд-мм-гг
};
 
struct list {
    ZapDB* key;
    list* prev;
    list* next;
};
 
int _tmain(int argc, _TCHAR* argv[]){
    list* Spisok = nullptr;
    list* head = nullptr;
    list* tail = nullptr;
    Search(Tree, search_str, search_otd, Spisok, head, tail);
    _getch();
    return 0;
}
 
void Search(node* Tree, char str[], int otd, list* Spisok, list* head, list* tail) {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    if (!Tree)
        return;
    char dr[] = "00-00-00";
    FindDR(Tree, str, otd, dr);
    if (str == NULL || otd == NULL) {
        cout << "Неверно введены данные для поиска" << endl;
        return;
    }
    SearchRecursion(Tree, otd, dr, Spisok, head, tail);
}
 
void SearchRecursion(node* Tree, int otd, char* dr, list* Spisok, list* head, list* tail) {
    if (Tree!=NULL) {
        if (Tree->key->otdel > otd) {
            SearchRecursion(Tree->left, otd, dr, Spisok, head, tail);
        }
        else if (Tree->key->otdel < otd) {
            SearchRecursion(Tree->right, otd, dr, Spisok, head, tail);
        }
        if (Tree->key->otdel == otd) {
            if (IsEarlier(Tree->key->dr, dr)) {
                InsertToList(Tree->key, Spisok, head, tail);
            }
            SearchRecursion(Tree->left, otd, dr, Spisok, head, tail);
            SearchRecursion(Tree->right, otd, dr, Spisok, head, tail);
        }
    }
}
 
void InsertToList(ZapDB* key, list* Spisok, list* head, list* tail) {
    list* lst = new list;
    lst->key = key;
    lst->prev = NULL;
    lst->next = NULL;
    if (Spisok == nullptr)
        Spisok = lst;
    else {
        tail->next = lst;
        lst->prev = tail;
        tail = lst;
    }
}

Почему при выходе из InsertToList переменная Spisok обнуляется?
Вложения
Тип файла: rar cpp.rar (3.8 Кб, 2 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2019, 01:23
Ответы с готовыми решениями:

Обнуление указателя в рекурсии
Есть такой код: void split(tree* h, int ind, tree* l, tree* r) { if (h == NULL) { l =...

Создание указателя на экземпляр класса, описанного после объявления указателя
Здравствуйте! Проблема в том, что нужно сделать так: class A{ public: B* b = nullptr; }; ...

Предотвращение продолжения работы потока после выхода из функции
https://books.google.ru/books?id=1UXRAAAAQBAJ&amp;pg=PA47&amp;lpg=PA47&amp;dq=%D0%B0%D1%81%D1%81%D0%BE%D1%86%D0%...

Обнуление значения переменных после итерации цикла
Всем привет. Помогите, пожалуйста, разобраться с заданием. В указанном коде не могу сделать так,...

6
Заблокирован
05.08.2019, 01:46 2
Лучший ответ Сообщение было отмечено rri9 как решение

Решение

Цитата Сообщение от rri9 Посмотреть сообщение
Почему при выходе из InsertToList переменная Spisok обнуляется?
Потому что на вход ты подаёшь копию значения указателя, которая существует только внутри функции.
Тем не менее, все операции по работе с памятью через этот указатель валидны и в данном случае ведут к утечке.
Если надо вернуть из функции адрес куска памяти, который ты внутри этой функции выделяешь, возвращай через return. Есть и другие способы, но мне этот больше нравится.

Добавлено через 3 минуты
Вот так примерно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
list* InsertToList(ZapDB* key, list* Spisok, list* head, list* tail) 
{
    list* lst = new list;
    
    lst->key = key;
    lst->prev = NULL;
    lst->next = NULL;
    
    if (!Spisok) Spisok = lst;
    else 
    {
        tail->next = lst;
        lst->prev  = tail;
        tail       = lst;
    }
    
    return Spisok; // <-------- ыЪ.
}
1
0 / 0 / 0
Регистрация: 04.01.2019
Сообщений: 23
05.08.2019, 11:44  [ТС] 3
Цитата Сообщение от Verevkin Посмотреть сообщение
Потому что на вход ты подаёшь копию значения указателя, которая существует только внутри функции.
Т.е. в данном случае несмотря на то, что передается указатель, работа с ним идет как с переменной и чтобы заработал первоначальный вариант надо было передавать указатель на указатель?
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
05.08.2019, 11:58 4
Цитата Сообщение от rri9 Посмотреть сообщение
надо было передавать указатель на указатель?
Или ссылку на указатель.
1
Заблокирован
05.08.2019, 15:06 5
Цитата Сообщение от rri9 Посмотреть сообщение
надо было передавать указатель на указатель?
Если ты хочешь, чтобы значение указателя изменялось функцией, то да.
Чем тебе не нравится возврат значения указателя? Это ж удобно, и вызов функции можно делать внутри условных операторов: "if", "while", "?:" и т.д.
1
0 / 0 / 0
Регистрация: 04.01.2019
Сообщений: 23
05.08.2019, 22:14  [ТС] 6
Цитата Сообщение от Verevkin Посмотреть сообщение
Чем тебе не нравится возврат значения указателя? Это ж удобно, и вызов функции можно делать внутри условных операторов: "if", "while", "?:" и т.д.
Про первоначальный вариант я спросил, чтобы разобраться!
Возврат значения указателя удобен, когда список пуст. А если он уже существует, возвращать его самого же?
0
Заблокирован
05.08.2019, 23:53 7
Цитата Сообщение от rri9 Посмотреть сообщение
Возврат значения указателя удобен, когда список пуст. А если он уже существует, возвращать его самого же?

А чо б не возвращать указатель на добавленный элемент?
1
05.08.2019, 23:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2019, 23:53
Помогаю со студенческими работами здесь

Не работает без указателя вызов функции в функции
int AmountOfSquares(int **Array) { NumberOfSquares++; for (i = iTempTwo + 1;...

Найти ошибку - после работы функции addStudent, оценки старых студентов не присваиваются новому массиву
Помогите найти ошибку. После работы функции addStudent, оценки старых студентов не присваиваются...

Обнуление указателя
Здравствуйте! Ребята, подскажите, по такому вопросу. Делаю консольное приложение вот код: ...

Обнуление формы, после отработки CallBack функции Javascript
Уважаемые, приветствую! Я новичёк в Web программировании, поэтому прошу отнестись с пониманием... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru