Подтвердить что ты не робот

C - инициализировать массив структур

У меня возникла проблема с инициализацией массива структур. Я не уверен, что я делаю это правильно, потому что получаю "инициализацию из несовместимого типа указателя" и "назначение из несовместимого типа указателя". Я добавил в код, где я получаю эти предупреждения, и когда я пытаюсь распечатать данные из структуры, я просто получаю мусор, такой как @@###

typedef struct
{
    char* firstName;
    char* lastName;
    int day;
    int month;
    int year;

}student;

//инициализировать массив

    student** students = malloc(sizeof(student));
    int x;
    for(x = 0; x < numStudents; x++)
    {
        //here I get: "assignment from incompatible pointer type" 
        students[x] = (struct student*)malloc(sizeof(student));
    }

    int arrayIndex = 0;

//добавить struct

 //create student struct
        //here I get: "initialization from incompatible pointer type"
        student* newStudent = {"john", "smith", 1, 12, 1983};

        //add it to the array
        students[arrayIndex] = newStudent;
        arrayIndex++;
4b9b3361

Ответ 1

student** students = malloc(sizeof(student));

Нет, нет, нет!

Вам не нужен **. Вы хотите * и достаточно места для того, как вам нужно много учеников

student* students = malloc(numStudents * sizeof *students);
for (x = 0; x < numStudents; x++)
{
    students[x].firstName = "John"; /* or malloc and strcpy */
    students[x].lastName = "Smith"; /* or malloc and strcpy */
    students[x].day = 1;
    students[x].month = 12;
    students[x].year = 1983;
}

Ответ 2

Не относится к предупреждениям компилятора, но ваш первоначальный malloc ошибочен; вы хотите:

malloc(sizeof(student *)* numStudents)

Чтобы выделить место для указателей numStudents для ученика. Строка:

students[x] = (struct student*)malloc(sizeof(student));

Должно быть:

students[x] = (student*)malloc(sizeof(student));

Нет такой вещи, как "struct student". Вы объявили неназванную структуру и typedef'd это "ученик". Сравните и сравните с:

struct student
{
    char* firstName;
    char* lastName;
    int day;
    int month;
    int year;

};

Что бы создать тип "struct student", но требует от вас (в C) явно ссылаться на struct student, а не просто на студента в другом месте. Это правило изменено для С++, поэтому ваш компилятор может быть немного нечетким.

Что касается:

student* newStudent = {"john", "smith", 1, 12, 1983};

Это должно быть:

student newStudent = {"john", "smith", 1, 12, 1983};

Поскольку синтаксис фигурной фигурной скобки является прямым литералом, а не чем-то еще, что вам нужно указать.

РЕДАКТИРОВАТЬ: по размышлению, я думаю, что aaa, возможно, взял больше обзора этого, чем я. Возможно ли, что вы непреднамеренно используете дополнительный уровень разыменования указателя повсюду? Поэтому вам нужно:

student* students = malloc(sizeof(student) * numStudents);

/* no need for this stuff: */
/*int x;
for(x = 0; x < numStudents; x++)
{
    //here I get: "assignment from incompatible pointer type" 
    students[x] = (struct student*)malloc(sizeof(student));
}*/

int arrayIndex = 0;

и

student newStudent = {"john", "smith", 1, 12, 1983};

//add it to the array
students[arrayIndex] = newStudent;
arrayIndex++;

Укажите, что массив не используется вне рамки newStudent. В противном случае неправильное копирование указателей на строки.

Ответ 3

student* students = malloc(sizeof(student)*numStudents);
int x;
for(x = 0; x < numStudents; x++)
{
    student newStudent = {"john", "smith", 1, 12, 1983}; // string copy are wrong still
    students[x] = newStudent;
}

Ответ 4

При инициализации, не так ли это?

student** students = (struct student**)malloc(sizeof(student*)*numStudents);

Однако почему указатель на указатель? Я думаю, что с указателем на структуру достаточно.