Как сбросить массив из структуры - PullRequest
3 голосов
/ 25 марта 2019

Я создал эту структуру:

typedef struct {
    char* id; 
    char* name;
    int birthYear;
    int finishedCourses;
    double avarage;
    int coursesNow;
    int courses[MAX_COURSES_YEAR];
}Student;

и теперь я пытаюсь установить массив курсов.

это то, что я написал:

s1.courses[] = {5,4,3,2};

и ошибка:

student.c: 15: 13: ошибка: ожидаемое выражение до токена ']'
s1.courses [] = {5,4,3,2};

Ответы [ 2 ]

4 голосов
/ 25 марта 2019
int courses[]={5,4,3,2};
memcpy (s1.courses, courses, sizeof(courses));

Другой способ сделать это:

typedef struct {
    char* id; 
    char* name;
    int birthYear;
    int finishedCourses;
    double avarage;
    int coursesNow;
    int courses[];
}Student;

int courses[]={5,4,3,2};
Student *s = malloc(sizeof(Student)+sizeof(courses));
memcpy (s->courses, courses, sizeof(courses));

В этом втором случае преимущество заключается в том, что вы выделяете во время выполнения самое измерение для курсов, вы не используете пространство заполнения или статически фиксированное пространство для поля.

Есть и другие способы сделать это.

2 голосов
/ 25 марта 2019

Инициализация массива через список инициализаторов допускается только после объявления. Так что вы можете сделать:

int arr[] = {1,2,3,4,5};

Но вы не можете сделать:

int arr[5];
arr = {1,2,3,4,5};

Вы должны использовать цикл или memcpy:

int tmp[] = {1,2,3,4,5};
// method 1
for(int i = 0; i < sizeof(tmp) / sizeof(*tmp); i++) {
    arr[i] = tmp[i];
}
// method 2
memcpy(arr, tmp, sizeof(tmp));

Вы также можете воспользоваться составными литералами и отказаться от массива tmp:

memcpy(arr, (int []) {1,2,3,4,5}, sizeof((int []) {1,2,3,4,5}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...