Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
chstr
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
1

Динамическое выделение памяти под структуру (malloc)

23.02.2016, 16:37. Просмотров 1006. Ответов 3
Метки нет (Все метки)

Нашел данное решение на этом форуме, но никак не могу понять как оно работает.
Вот даны структуры:

C++
1
2
3
4
5
6
7
8
9
10
11
struct info // структура содержания информационного поля
{
    int *arrint; // массив чисел
    char arrchar[3]; // массив символов
};
 
struct list // структура списка 
{
    info elem; // информационная часть
    list *next; // ссылка следующий элемент 
};
Вот работа с ними:

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
int Add(list *pointer)
{
    int n, num;
    num = 0;
    cout << "Добавить элемент \n";
    cout << "Введите количество элементов в массиве чисел:";
    cin >> n;
    if (pointer == NULL)
    {
        cout << "Введите первый элемент списка\n";
        pointer = (list*)malloc(sizeof(list)+n*sizeof(int)); // выделение памяти под структуру
        pointer[num].elem.arrint = (int*)malloc(n*sizeof(int));
        cout << "Введите элементы массива:\n";
        DataInput(pointer,n);
    }
    return 0;
};
 
int DataInput(list *inputpointer, int m)     // Ввод массива чисел и символов
{
    char ch;
    int i, value;
    for (i = 0; i < m; i++) // ввод массива чисел
    {
        cout << "ArrInt[" << i << "]=";
        cin >> value;
        inputpointer->elem.arrint[i] = value;
    }
    cout << "Массив целых чисел введен. \n";
    for (i = 0; i < 3; i++)  // ввод трех символов
    {
        cout << "ArrChar[" << i << "]=";
        cin >> ch;
        inputpointer->elem.arrchar[i] = ch;
    }
    cout << "Массив символов введен. \n";
    return 0;
};
Вот в чем вопрос:
pointer = (list*)malloc(sizeof(list)+n*sizeof(int)); - что делает данная операция? для меня это выделение памяти под всю структуру и передача указателя первого байта памяти в pointer.
НО почему программа отказывается работать (вылетает при работе с исключением) без: pointer[num].elem.arrint = (int*)malloc(n*sizeof(int)); и что вообще делает эта команда, если вроде бы уже в первой всё сделано? почему перед указателем на элемент структуры нужно ставить [num]?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2016, 16:37
Ответы с готовыми решениями:

Динамическое выделение памяти под структуру
#include &lt;iostream&gt; using namespace std; struct person { char*name; char...

Динамическое выделение памяти malloc()
Здравствуйте! Cкажите пожалуйста, как узнать каков максимальный объем...

Выделение памяти под структуру
Доброго дня, товарисчи. В общем, возникла проблема при выделении памяти для...

Выделение памяти под структуру
enrollee *p=new enrollee; после работы delete p; выбивает ошибку....

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

3
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
23.02.2016, 20:20 2
Цитата Сообщение от chstr Посмотреть сообщение
Вот в чем вопрос:
pointer = (list*)malloc(sizeof(list)+n*sizeof(int)); - что делает данная операция? для меня это выделение памяти под всю структуру и передача указателя первого байта памяти в pointer.
Тут лишнее выделяется: n*sizeof(int)
C++
1
2
pointer = (list*)malloc(sizeof(list)); // выделение памяти под структуру
pointer ->elem.arrint = (int*)malloc(n * sizeof(int));// выделение памяти под массив целых чисел
1
chstr
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
23.02.2016, 22:43  [ТС] 3
Цитата Сообщение от chstr Посмотреть сообщение
char arrchar[3]; // массив символов
Под символы тоже отдельно выделять получается? Я думал всё сразу происходит, после pointer = (list*)malloc(sizeof(list)); // выделение памяти под структуру
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
23.02.2016, 22:51 4
Лучший ответ Сообщение было отмечено chstr как решение

Решение

Цитата Сообщение от chstr Посмотреть сообщение
Под символы тоже отдельно выделять получается?
Под под массив символов не нужно, там и так выделится. Память, адрес которой будет хранится в указателе (arrint), нужно выделять.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2016, 22:51

Динамическое выделение памяти под массив
Я хочу функцию использовать пару раз, количество команд будет уменьшаться, и...

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

Динамическое выделение памяти под строки
Доброго времени суток. Изучаю основы C++, дошел до раздела &quot;указатели и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru