Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
chstr
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
#1

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

23.02.2016, 16:37. Просмотров 738. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Динамическое выделение памяти под структуру (malloc) (C++):

Динамическое выделение памяти под структуру - C++
#include &lt;iostream&gt; using namespace std; struct person { char*name; char *adres; int age; }; void allocation (person *mas,...

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

Выделение памяти под структуру - C++
enrollee *p=new enrollee; после работы delete p; выбивает ошибку. неправильно очищаю???

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

Выделение памяти под структуру - C++
Доброго дня, товарисчи. В общем, возникла проблема при выделении памяти для структуры. Подскажите, пожалуйста, в чем ошибка. Собсна сам...

Динамическое выделение памяти под массив - C++
Я хочу функцию использовать пару раз, количество команд будет уменьшаться, и &quot;n&quot; надо менять. Как написать не знаю. 12 или 13 строка. ...

3
nd2
2820 / 2390 / 851
Регистрация: 29.01.2016
Сообщений: 8,004
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
2820 / 2390 / 851
Регистрация: 29.01.2016
Сообщений: 8,004
23.02.2016, 22:51 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от chstr Посмотреть сообщение
Под символы тоже отдельно выделять получается?
Под под массив символов не нужно, там и так выделится. Память, адрес которой будет хранится в указателе (arrint), нужно выделять.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2016, 22:51
Привет! Вот еще темы с ответами:

Динамическое выделение памяти под объект - C++
Здравствуйте, меня интересует несколько вопросов по поводу конструкции new. Есть такой код: struct element { std::string...

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

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

Динамическое выделение памяти под двумерный массив - C++
1) Ввести построчно элементы двумерного массива чисел. Количество столбцов задается. Количество строк (не менее 1) равно максимальному по...


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

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

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