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++;
Ответы
Ответ 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);
Однако почему указатель на указатель? Я думаю, что с указателем на структуру достаточно.