Проблема доступа к членам в структуре указателя, расположенной в другой структуре указателя - PullRequest
1 голос
/ 08 января 2020

У меня возникают проблемы с доступом к членам внутри структур.

У меня есть структура Student и Cursus, они определены следующим образом:

typedef struct {
    int* _notes;
    int _moyenne;
}Cursus;

typedef struct {
    Cursus* _mycursus; //1 francais, 2 english, 3 math
    char nom[255];
    char prenom[255];
    char classe[3];
}Student;

В основном. c Я создал это:

Student * mystudents = (Student*) calloc(9,sizeof(Student));

Но я не могу получить доступ к членам с индексом. Это никогда не будет работать, например:

mystudents[index]->nom

Так что я нашел другой способ сделать это

(mystudients+index)->nom 

И это работает отлично!

Теперь у меня следующая проблема: я хотел бы сделать это:

(mystudients+index)->(_mycursus+indexcursus)->_notes = (Cursus*)calloc(1,sizeof(Cursus);

И это не работает, потому что не принимает тот факт, что я добавляю скобки в "_mycrusus". Как я могу выбрать правильный курс, если я не могу этого сделать?

Спасибо за вашу помощь,

Impact

Ответы [ 3 ]

5 голосов
/ 08 января 2020

In C, x[i] идентично *(x + i). В вашем случае тип mystudents[index] - это Student, а не Student*.

. Поэтому либо используйте (mystudents + index)->nom, либо, условно, mystudents[index].nom.

То же самое. подходит для других членов:

mystudients[index]._mycursus = calloc(1, sizeof (Cursus));
mystudients[index]._mycursus[0]._notes = calloc(3, sizeof (int));

et c.

Обратите внимание, что вы не должны приводить возвращаемое значение malloc, calloc et c.

1 голос
/ 08 января 2020

Вы используете неправильный синтаксис

это должно быть

((mystudients+index)->_mycursus+indexcursus)->_notes = (Cursus*)calloc(1,sizeof(Cursus);
0 голосов
/ 08 января 2020

Благодаря всем, Visual Studio принудительно использует Malloc / Callo c, вы не можете скомпилировать без этого. Я упростил задачу, чтобы получить ответы на некоторые вопросы, но на самом деле я отправил указатель mystudents в другой функции, подобной этой: void AjouterEleve(Eleve ** a_eleves), потому что я хотел изменить количество студентов, не возвращая значение в функции. Благодаря полученным замечательным ответам я узнаю, как это сделать:

scanf("%d", &(*a_eleves)[i]._lescours[choix - 1]._notes[(*a_eleves)[i]._lescours[choix - 1]._nb_notes-1]); 

(* a_eleves) [i]. действительно был ключом, когда мы получаем указатель указателя на параметры!

...