0 / 0 / 0
Регистрация: 03.05.2014
Сообщений: 4
1

Динамическое выделение для массива структур. Программа вылетает без ошибок на использовании функции realloc

03.05.2014, 21:31. Показов 2573. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здесь код: ссылка
В массив структур нужно записать новый элемент, выделить для него память. Функция выглядит так:
C
1
2
3
4
5
6
7
8
9
10
int resize(int line, person* bd)
{
    person* shit;
    shit = (person*)realloc(bd, (line + 1)*sizeof(person));
    if (shit != NULL)
    {
        bd = shit;
    }
    return 1;
}
Ну здесь всё очевидно.
Дело в том, что после второго использования resize программа вылетает без ошибок на использовании функции realloc.

Вторая проблема в том, что после добавления и инициализации второго элемента массива(одно использование realloc) структура(которая и является этим вторым элементом) не записывается корректно, хотя при отладке видно, что всё нормально.

А при использовании free() на bd программа, опять же, вылетает, хотя указатель bd и был инициализирован с помощью malloc.

Как это исправить? В чём проблема? Я думал, что неправильно использую realloc, но видел пример увеличивающегося массива, где всё точно так же (плюс функция free).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2014, 21:31
Ответы с готовыми решениями:

При расширении первой строки двумерного массива (с помощью realloc) программа вылетает
При расширении первой строки двумерного массива с помощью realloc, программа вылетает. Собственно...

Программа вылетает без ошибок
Реализую предметную область "Полином" Не могу понять, в чем проблема: значения вводятся, ошибок...

Динамическое выделение памяти для структур
Добрый день. Есть следующие структуры: typedef struct __attribute__((aligned(16))) {...

Вылетает программа при использовании функции класса
Есть класс Match: #include "coefficient.h" #include "team.h" #include <QString> #include...

4
54 / 54 / 47
Регистрация: 16.03.2014
Сообщений: 110
Записей в блоге: 2
03.05.2014, 23:26 2
Функция count_line() всегда будет возвращать 0.

C
1
2
3
4
5
6
7
8
9
10
11
int count_line(person* bd, int* n)
{
        for (int i = 0; i < *n; i++)
        {
                if (!strcmp((bd + i)->deleted, "deleted")) // bd[0].deleted = "deleted"
                {
                        return i; // i = 0
                }
        }
        return *n;
}
Поскольку deleted нулевого элемента массива стуктур bd опеределён как "deleted".

C
1
2
3
4
5
6
7
8
9
int main()
{
        setlocale(LC_ALL, "Rus");
        int n = 1;
        person* bd = (person*)malloc(n * sizeof(person));
        strcpy((bd)[0].deleted, "deleted\0"); // !!!!!!!
        while (show_menu(bd, &n));
        return 0;
}
Соответственно в функцию resize() всегда будет передаваться line = 0!!!

C
1
2
3
4
5
6
7
8
9
10
int resize(int line, person* bd) // line = 0 (ВСЕГДА!!!)
{
        person* shit;
        shit = (person*)realloc(bd, (line + 1)*sizeof(person));
        if (shit != NULL)
        {
                bd = shit;
        }
        return 1;
}
0
0 / 0 / 0
Регистрация: 03.05.2014
Сообщений: 4
03.05.2014, 23:58  [ТС] 3
Нет. При отладке можно видеть, что она возвращает при выборе пункта меню (1) сначала 0, потом 1, потом 2 (где потом программа и закрывается на функции resize). Да и это можно видеть по надписи "запись добавлена под номером .."
А значение элемента deleted меняется с "deleted" на "works" в функции add_line после switch.
Сори, что нет комментариев.
0
54 / 54 / 47
Регистрация: 16.03.2014
Сообщений: 110
Записей в блоге: 2
03.05.2014, 23:58 4
Извиняюсь - это полуночный бред!!! Поторопился с выводами!!! НЕ ОРАЩАТЬ ВНИМАНИЯ!!!
0
0 / 0 / 0
Регистрация: 03.05.2014
Сообщений: 4
04.05.2014, 00:22  [ТС] 5
Я разобрался. Всего-то надо было погуглить на английском.
Проблема была в том, что нельзя изменять внутри функции значение объектов, на которые ссылаются передаваемые функции указатели. Чтобы их изменить, нужно передавать указатели на указатели. Так например, в функции resize будет тройной указатель, который приходит из функции add_line, где указатель двойной.
Такие дела.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2014, 00:22
Помогаю со студенческими работами здесь

Динамическое распределение памяти: программа, вылетает на вводе непосредственно первого элемента массива
Исправте пожалуйста, вылетает на вводе непосредственно первого элемента массива из символов!...

Выделение памяти с помощью функции realloc
в общем задачка по сути своей вроде бы легкая, должна укладываться в 60 строчек, но что-то допереть...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru