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

Как массив структур записать в динамическую память

28.01.2015, 17:30. Просмотров 902. Ответов 16
Метки нет (Все метки)

Привет всем, осваиваю язык Си по-маленьку.
Ума не приложу как этот массив запихнуть в динамическую память?
C
1
2
3
4
5
6
7
8
9
10
11
12
#define N 20
 
static student group[N] = 
    {
        {"Ivanov",          {5,4,4}},
        {"Petrashevsky",    {4,3,4}},
        {"Kim",             {5,3,5}},
        {"Pupkin",          {4,2,3}},
        {"Kuzin",           {5,5,5}}
    };
    int nstud = 5;//сколько сейчас реально присутствует(5 чел)
    student *pstud = group;//указатель где искать наших студентов
Программа многофайловая, это один из файлов, с таким кодом все нормально работает.
Но задача этот код изменить, чтобы создавался массив динамически с помощью malloc.
Попробовал так, но не хочет работать:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int nstud = 5;//сколько сейчас реально присутствует(5 чел)
 
student *group = (student *) malloc(N * sizeof(student));
student group[] =
    {
        {"Ivanov",          {5,4,4}},
        {"Petrashevsky",    {4,3,4}},
        {"Kim",             {5,3,5}},
        {"Pupkin",          {4,2,3}},
        {"Kuzin",           {5,5,5}}
    };
 
student *pstud = group;//указатель где искать наших студентов
Может подскажет кто-нибудь как это сделать, а то что-то у меня ни в какую не получается, как ни пробую
ps программа из курса "специалист"
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2015, 17:30
Ответы с готовыми решениями:

Есть массив структур в автоматической памяти. Нужно перенести его в динамическую память
student* transfer (student* s) { student* s1; int i; for (i =...

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

Как выделить память под массив структур?
Привет всем! Помогите, не знаю как выделить память под массив структур. ...

Подскажите, как выделить динамическую память в функции?
Добрый вечерок^_^ Подскажите, как выделить динамическую память под матрицу...

Как выделить динамическую память для матрицы?
Как выделить динамическую память для матрицы?

16
Jewbacabra
Эксперт PHP
3747 / 3093 / 1362
Регистрация: 24.04.2014
Сообщений: 9,375
28.01.2015, 18:19 2
C
1
2
3
student *group = (student *) malloc(N * sizeof(student));
group[0] = {"Ivanov", {5,4,4}};
group[1] = //.........;
0
fortythousand
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 21
28.01.2015, 18:31  [ТС] 3
Так тоже почему-то не хочет работать, пишет
1>------ Build started: Project: Student, Configuration: Debug Win32 ------
1>Compiling...
1>data.c
1>c:\visualstudioprojects\student\student\data.c(29) : error C2099: initializer is not a constant
1>c:\visualstudioprojects\student\student\data.c(31) : error C2466: cannot allocate an array of constant size 0
1>c:\visualstudioprojects\student\student\data.c(31) : error C2372: 'group' : redefinition; different types of indirection
1> c:\visualstudioprojects\student\student\data.c(29) : see declaration of 'group'
1>c:\visualstudioprojects\student\student\data.c(31) : warning C4047: 'initializing' : 'int' differs in levels of indirection from 'char [7]'
1>c:\visualstudioprojects\student\student\data.c(31) : error C2078: too many initializers
1>c:\visualstudioprojects\student\student\data.c(32) : error C2372: 'group' : redefinition; different types of indirection
1> c:\visualstudioprojects\student\student\data.c(29) : see declaration of 'group'
1>c:\visualstudioprojects\student\student\data.c(32) : warning C4047: 'initializing' : 'int' differs in levels of indirection from 'char [13]'
1>c:\visualstudioprojects\student\student\data.c(32) : error C2078: too many initializers
1>c:\visualstudioprojects\student\student\data.c(33) : error C2372: 'group' : redefinition; different types of indirection
1> c:\visualstudioprojects\student\student\data.c(29) : see declaration of 'group'
1>c:\visualstudioprojects\student\student\data.c(33) : warning C4047: 'initializing' : 'int' differs in levels of indirection from 'char [4]'
1>c:\visualstudioprojects\student\student\data.c(33) : error C2078: too many initializers
1>c:\visualstudioprojects\student\student\data.c(33) : fatal error C1903: unable to recover from previous error(s); stopping compilation
1>Build log was saved at "file://c:\VisualStudioProjects\Student\Student\Debug\BuildLog.htm"
1>Student - 9 error(s), 3 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
И еще когда навожу курсор на group выдается подсказка int group[4], хотя тип я указывал student * и элементов 5, а не 4
0
Jewbacabra
Эксперт PHP
3747 / 3093 / 1362
Регистрация: 24.04.2014
Сообщений: 9,375
28.01.2015, 18:52 4
fortythousand, нужен весь код
0
fortythousand
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 21
28.01.2015, 19:08  [ТС] 5
data.c
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "data.h"
#include <stdlib.h>//for malloc
#include<malloc.h>
#define N 20
 
int nstud = 5;//сколько сейчас реально присутствует(5 чел)
 
student *group = (student *) malloc(N * (sizeof(student)));
 
group[0] = {"Ivanov", {5,4,4}};
group[1] = {"Petrashevsky", {4,3,4}};
group[2] = {"Kim", {5,3,5}};
group[3] = {"Pupkin", {4,2,3}};
group[4] = {"Kuzin", {5,5,5}};
 
student *pstud = group;//указатель где искать наших студентов

data.h
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef DATA_H
#define DATA_H
 
#define MAXLEN 32
#define MAXGRADES  3
 
    typedef struct
    {
        char last_name[MAXLEN];
        int grade[MAXGRADES];
    }student;
 
extern student *pstud;
extern int nstud;
 
#endif

menu.c
Кликните здесь для просмотра всего текста
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
#include<stdio.h>
#include<stdlib.h>
 
#include"menu.h"
 
void menu(const menu_item list[], int n)
{
    int i,r;
 
    while(1)
    {
        system("cls");
 
        for(i=0; i<n; ++i)
            printf("%d. %s\n",i+1, list[i].text);
        printf("%d. %s\n",0, "Выход");
 
        do
        {
            printf("\nВведите номер команды: ");
            fflush(stdin);
        }
        while (scanf("%d",&r)!=1 || r<0 || r>i);// i отображает сколько номеров напечатали, из цикла
 
        if(--r<0) break;// по нулю мы выходим из вечного цикла
        nstud = list[r].command(pstud,nstud);//здесь уже тогда не надо уменьшать на единичку (r-1)
 
        system("pause");
    }
 
}

menu.h
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef MENU_H
#define MENU_H
 
#include"data.h"//описание student
 
typedef struct
{
    const char *text;
    int (*command)(student *pstud, int n);//возвращает n т.к. может добавить или удалить записи
}menu_item;
 
void menu(const menu_item list[], int n);//n для размера массива, т.к. массив не char
 
#endif

main.c
Кликните здесь для просмотра всего текста
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
#include <stdlib.h>
 
#include "menu.h"
#include "in_out.h"
#include "func.h"
 
 
 
int main()
{
    menu_item list[] =
    {
        {"Ввод", input},
        {"Вывод", output},
        {"Сортировать", sort_by_name}/*,
        {"Сохранить", NULL},
        {"Загрузить", NULL}*/
    };
 
    system("chcp 1251 > nul");
 
    menu(list, sizeof list / sizeof *list);
 
    //free(pstud);
    system("pause");
}

in_out.c
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
 
#include"data.h"
#include"in_out.h"
 
int input(student *pstud, int nstud)
{
    return nstud;
}
 
int output(student *pstud, int nstud)
{   
    int i,j;
    for(i=0; i<nstud; ++i)
    {
        fprintf(stdout,"%s",pstud[i].last_name);
        for(j=0; j<MAXGRADES; ++j)
            fprintf(stdout,"%2d", pstud[i].grade[j]);
        fprintf(stdout,"\n");
    }
    return nstud;
}

in_out.h
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
#ifndef IN_OUT_H
#define IN_OUT_H
 
int input(student *pstud, int nstud);
int output(student *pstud, int nstud);
 
#endif

func.c
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdlib.h>
#include<string.h>//сравнение строк
 
#include"data.h"
#include"func.h"
 
static int name_cmp(const void *e1, const void *e2)
{
    return strcmp(((const student *)e1)->last_name, ((const student *)e2)->last_name);
}
 
int sort_by_name(student *pstud, int nstud)
{
    qsort(pstud, nstud, sizeof(student), name_cmp);
    return nstud;
}

func.h
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
#ifndef FUNC_H
#define FUNC_H
 
int sort_by_name(student *pstud, int nstud);
 
#endif
0
Jewbacabra
Эксперт PHP
3747 / 3093 / 1362
Регистрация: 24.04.2014
Сообщений: 9,375
28.01.2015, 21:14 6
fortythousand, перенеси
Цитата Сообщение от fortythousand Посмотреть сообщение
C
1
2
3
4
5
group[0] = {"Ivanov", {5,4,4}};
group[1] = {"Petrashevsky", {4,3,4}};
group[2] = {"Kim", {5,3,5}};
group[3] = {"Pupkin", {4,2,3}};
group[4] = {"Kuzin", {5,5,5}};
в main
0
fortythousand
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 21
29.01.2015, 09:49  [ТС] 7
Все равно не хочет ни в какую. Я не могу понять, так то по логике вещей ведь код вроде правильно написан, но почему работать не хочет никак не въеду?

Добавлено через 35 минут
Почему то даже так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>
#include "data.h"
#define N 20
 
int nstud = 5;
student group[N];
 
student *pstud = group;
 
group[0] = {"Ivanov", {5,4,4}};
group[1] = {"Petrashevsky", {4,3,4}};
group[2] = {"Kim", {5,3,5}};
group[3] = {"Pupkin", {4,2,3}};
group[4] = {"Kuzin", {5,5,5}};
отказывается работать
0
Jewbacabra
Эксперт PHP
3747 / 3093 / 1362
Регистрация: 24.04.2014
Сообщений: 9,375
29.01.2015, 09:52 8
Цитата Сообщение от fortythousand Посмотреть сообщение
отказывается работать
перенеси в main (или в любую другую функцию)
0
fortythousand
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 21
29.01.2015, 12:30  [ТС] 9
Перенес в main.c
Кликните здесь для просмотра всего текста
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
#include <stdlib.h>
 
#include "menu.h"
#include "in_out.h"
#include "func.h"
 
#include "data.h"
 
 
int main()
{
int nstud = 5;//сколько сейчас реально присутствует(5 чел)
student group[N];
 
student *pstud = group;
 
 
group[0] = {"Ivanov", {5,4,4}};
group[1] = {"Petrashevsky", {4,3,4}};
group[2] = {"Kim", {5,3,5}};
group[3] = {"Pupkin", {4,2,3}};
group[4] = {"Kuzin", {5,5,5}};
 
 
 
    menu_item list[] =
    {
        {"Ввод", input},
        {"Вывод", output},
        {"Сортировать", sort_by_name}/*,
        {"Сохранить", NULL},
        {"Загрузить", NULL}*/
    };
 
    system("chcp 1251 > nul");
 
    menu(list, sizeof list / sizeof *list);
    system("pause");
}

И не хочет работать. Ну и хотелось бы именно в data.c ее оставить. Ведь там ей по идее никто не должен мешать работать. Странно все как-то.

Добавлено через 2 часа 27 минут
Что-то я вообще туплю. Сделал другой пример совсем простой для проверки работы malloc
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdlib.h>//for malloc
#include <stdio.h>
 
typedef struct
{
    int grade[3];
    char name[50];
}student;
 
main()
{
    student *baza;
 
    baza = (student*) malloc(sizeof(student));
    *baza = {{5,4,3},"sdfsdfsa"};
    printf("%d\n%s\n", baza.grade[2], baza.name);
}
и ни в какую, где я что делаю не так?
0
Jewbacabra
Эксперт PHP
3747 / 3093 / 1362
Регистрация: 24.04.2014
Сообщений: 9,375
29.01.2015, 13:02 10
Цитата Сообщение от fortythousand Посмотреть сообщение
Что-то я вообще туплю.
Да это я тут что-то туплю
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdlib.h>//for malloc
#include <stdio.h>
#include <string.h>
 
typedef struct
{
    int grade[3];
    char name[50];
}student;
 
int main()
{
    student *baza;
 
    baza = (student*) malloc(sizeof(student));
    strcpy(baza->name, "sdsfgg");
    baza->grade[0] = 5;
    baza->grade[1] = 4;
    baza->grade[2] = 3;
    printf("%d\n%s\n", baza->grade[2], baza->name);
    return 0;
}
1
fortythousand
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 21
29.01.2015, 13:22  [ТС] 11
Jewbacabra, Спасибо, так заработало! А
strcpy(baza->name, "sdsfgg");
принципиально нужно так или без strcpy еще можно как-то по-другому?
0
Справлюсь
23 / 23 / 14
Регистрация: 24.07.2014
Сообщений: 209
29.01.2015, 13:26 12
fortythousand,
Цитата Сообщение от fortythousand Посмотреть сообщение
C++
1
2
3
4
5
group[0] = {"Ivanov", {5,4,4}};
group[1] = {"Petrashevsky", {4,3,4}};
group[2] = {"Kim", {5,3,5}};
group[3] = {"Pupkin", {4,2,3}};
group[4] = {"Kuzin", {5,5,5}};
понимаеш такой код - это команда записать в память опеделённое значение-т.е он должен находится функции майн т.к. это команда

Цитата Сообщение от fortythousand Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
student group[] =
{
{"Ivanov",{5,4,4}},
{"Petrashevsky",{4,3,4}},
{"Kim",{5,3,5}},
{"Pupkin",{4,2,3}},
{"Kuzin",{5,5,5}}
};
а вот этот код выделяет память под массив(ну и присваивает ему первоначальное значение)
статическая память выделяется не когда выполняется какая либо функция а когда прога загружается на выполнение(если ошибаюсь поправте, я в асме плохо разбираюсь)
0
fortythousand
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 21
29.01.2015, 13:42  [ТС] 13
Справлюсь, почему тогда в таком коде
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
typedef struct
{
    char last_name[32];
    int grade[3];
}student;
 
 
 
int main()
{
student group[20];
 
group[0] = {"Ivanov", {5,4,4}};
group[1] = {"Petrashevsky", {4,3,4}};
group[2] = {"Kim", {5,3,5}};
group[3] = {"Pupkin", {4,2,3}};
group[4] = {"Kuzin", {5,5,5}};
 
}

все находится в main, вначале массив структур group резервируется в статической памяти, все вроде верно, но не работает?
0
Справлюсь
23 / 23 / 14
Регистрация: 24.07.2014
Сообщений: 209
29.01.2015, 13:50 14
fortythousand, а что за ошибка?
0
fortythousand
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 21
30.01.2015, 11:19  [ТС] 15
Кликните здесь для просмотра всего текста
1>------ Build started: Project: Work1, Configuration: Debug Win32 ------
1>Compiling...
1>prog1.c
1>c:\visualstudioprojects\work1\work1\prog1.c(56) : error C2059: syntax error : '{'
1>c:\visualstudioprojects\work1\work1\prog1.c(57) : error C2059: syntax error : '{'
1>c:\visualstudioprojects\work1\work1\prog1.c(58) : error C2059: syntax error : '{'
1>c:\visualstudioprojects\work1\work1\prog1.c(59) : error C2059: syntax error : '{'
1>c:\visualstudioprojects\work1\work1\prog1.c(60) : error C2059: syntax error : '{'
1>Build log was saved at "file://c:\VisualStudioProjects\Work1\Work1\Debug\BuildLog.htm"
1>Work1 - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


Добавлено через 20 часов 3 минуты
Создастся ли по данному коду массив структур в динамической памяти или не сработает такой прием?
Здесь я создал функцию изменения адреса массива на адрес в динамической памяти, потом вызываю эту функцию из другого файла, где идет обращение к этому массиву. Программа работает, но в отладчике вроде бы адрес не меняется (или я что-то не понял). Не могу понять работает этот код как надо или все же создается все в статической памяти? Чего тогда не хватает, по логике вроде правильно все?
Кликните здесь для просмотра всего текста
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
#include <stdlib.h>
#include <string.h>
#include "data.h"
 
#define N 20
 
void dynamic(void);
 
static student group[N] =
    {
        {"Ivanov",          {5,4,4}},
        {"Petrashevsky",    {4,3,4}},
        {"Kim",             {5,3,5}},
        {"Pupkin",          {4,2,3}},
        {"Kuzin",           {5,5,5}}
    };
int nstud = 5;
student *pstud = group;
 
void dynamic(void)
{
student *group = NULL;
group = (student *)malloc(N * sizeof(student));
};
0
schdub
Эксперт С++
3039 / 1381 / 421
Регистрация: 19.01.2009
Сообщений: 3,717
Завершенные тесты: 1
31.01.2015, 00:47 16
Лучший ответ Сообщение было отмечено schdub как решение

Решение

fortythousand, в функции dynamic() утечка памяти. На самом деле вы определили локальную group, которая скрывает глоабальную group. Выделенная память, указатель на которую сохранен в локальной group остается не освобожденным.


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
// ...
 
struct student {
    char name[50];
    int  data[3];
} ;
 
void dynamic(struct student ** pgroup, unsigned count) {
    struct student *group = (struct student *)malloc(count * sizeof(struct student));
    // TODO: дополнительные инициализации если нужно
 
    // возвращаем из функции указатель на память, которую мы выделели
    *pgroup = group;
};
 
 
int main() {
 
    struct student * pgroup = NULL;
    dynamic(&pgroup, 5);
    if (pgroup == NULL) {
        return EXIT_FAILURE;
    }
 
    // TODO: работаем с динамически выделенными 5 структурами
    //       через указатель pgroup
 
 
    // удаляем выделенную в dynamic() память
    free(pgroup);
 
    return EXIT_SUCCESS;
}
1
fortythousand
0 / 0 / 0
Регистрация: 28.01.2015
Сообщений: 21
31.01.2015, 09:51  [ТС] 17
schdub, Спасибо, разобрался, заработало!
0
31.01.2015, 09:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2015, 09:51

Подскажите как переделать программу в динамическую память
#include &lt;stdio.h&gt; #include &lt;locale.h&gt; #include &lt;stdlib.h&gt; #include...

Как выделить память для массива структур?
выделить пямять для такой структуры на n элементов typedef struct coordinates...

Записать данные из массивов 5 почти одинаковых структур в один двухмерный массив
Пытаюсь записать данные из массивов 5 почти что одинаковых структур в один...


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

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

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