Я узнаю о векторе указателей в C как часть задания. Однако одна часть моего кода не запускается, и я не понимаю, почему. Я включил полный код ниже, хотя моя проблема заключается именно в функции selectApproved.Вектор указателей с динамическим распределением памяти в C
У меня есть только проблемы с функцией selectApproved. Он получает вектор-указатель типа Студент, который является структурой, которую я определил и среди ее элементов имеет оценки двух разных тестов. Предполагается, что функция рекурсивно идентифицирует студентов, которые достигли результата прохождения (определяется как test1 + test2> = 10) и возвращает вектор указателей, в котором каждый элемент вектора указателя содержит указатель на Студент struct ,
Ошибка после утверждения printf ("Позиция% d \ n", позиция); находится, после всех рекурсивных вызовов. В частности, я знаю, что ошибка возникает при этом утверждении: approved_students [position] = vector [position];.
Я не понимаю, почему эта ошибка происходит. После того, как все рекурсивные вызовы произошли, я динамически выделяю свой вектор указателя, чтобы точно удерживать число прошедших студентов: approved_students = (Student **) malloc ((* прошло) * sizeof (Student *)). Насколько я понимаю, approved_student должен иметь точно количество «слотов» как * переданных (в данном случае 4 слота). Я даже отношусь к случаю, когда ни один студент не был одобрен в выражении if if (num_students == 0).
Я знаю, что моя рекурсивная функция работает хорошо, поскольку printf («Позиция% d \ n», позиция); распечатывает 3, что означает, что 4 ученика были одобрены как ожидалось (учащиеся 0,1,2,3 были одобрены). Используемая среда IDE (Visual Studio 2012) позволяет мне делать approved_students [position] = vector [position];. Это утверждение, на мой взгляд, говорит о том, что, например, approved_students [position] будет содержать указатель на структуру, расположенную в vector [position]. В конце концов, approved_student - это вектор указателей.
Я действительно потерял, почему функция не работает. Может ли кто-нибудь помочь? Я думаю
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
struct Studentgrade{
float test1;
float test2;
};
typedef struct Studentgrade Grade;
struct student
{
int ID_number;
char name[51];
Grade *scores;
};
typedef struct student Student;
Student *createStudent(int ID_num, char name_student[], float test1_grade, float test2_grade){
int i = 0;
Student *newStudent = (Student *) malloc(sizeof(Student));
if (newStudent == NULL){
printf("Error in memory allocation\n");
exit(1);
}
newStudent->scores = (Grade *) malloc(sizeof(Grade));
if (newStudent->scores == NULL){
printf("Error in memory allocation\n");
exit(1);
}
newStudent->scores->test1 = test1_grade;
newStudent->scores->test2 = test2_grade;
newStudent->ID_number = ID_num;
while(i < 51 && name_student[i] != '\0')
newStudent->name[i] = name_student[i++];
newStudent->name[i] = '\0';
return newStudent;
}
Student **selectApproved(Student *vector[], int num_students, int *passed){
int position;
int i;
float comparison;
Student **approved_students = NULL;
if(num_students == 0){
if(*passed == 0){
printf("No student passed\n");
return NULL;
}
else{
approved_students = (Student **) malloc((*passed) * sizeof(Student *));
/*for (i = 0; i < (*passed); i++)
approved_students[i] = (Student *) malloc(sizeof(Student *));*/
if (approved_students == NULL){
printf("Error in memory allocation\n");
exit(1);
}
return approved_students;
}
}
comparison = (vector[0]->scores->test1) + (vector[0]->scores->test2);
if(comparison >= 10){
position = *passed;
(*passed)++;
approved_students = selectApproved(&vector[1], num_students - 1, passed);
printf("Position %d\n", position);
approved_students[position] = vector[position];
}
else
selectApproved(&vector[1], num_students - 1, passed);
return approved_students;
}
int main(void){
Student *vpstudent[12];
Student **vpstudent2;
int i = 0;
vpstudent[0] = createStudent(444,"Rita",6.4, 7.8);
vpstudent[1] = createStudent(111,"Rita",5.6, 8.8);
vpstudent[2] = createStudent(999,"Rita",8.2, 7.1);
vpstudent[3] = createStudent(555,"Dina",2.7, 6.4);
vpstudent[4] = createStudent(777,"Lana",9.5, 5.3);
vpstudent[5] = createStudent(666,"Tais",2.2, 2.8);
vpstudent[6] = createStudent(222,"Cris",3.1, 4.2);
vpstudent[7] = createStudent(333,"Vera",4.4, 5.4);
vpstudent[8] = createStudent(888,"Cris",4.4, 5.4);
vpstudent[9] = createStudent(303,"Vera",4.4, 5.4);
vpstudent[10] = createStudent(101,"Cris",5.4, 3.4);
vpstudent[11] = createStudent(202,"Vera",1.4, 8.4);
vpstudent2 = selectApproved(vpstudent, 12, &i);
return 0;
}
Поскольку ничего в коде, который вы выложили, фактически называет 'selectApproved', сложно сказать, как вы можете получить эту ошибку. – Tibrogargan
C не имеет векторного типа. Вы имеете в виду _arrays_? И не бросайте результат 'malloc' & friends или' void * 'вообще. – Olaf
Тиброгарган, я только что исправил это (не был вызван вызов selectApproved). И Олаф, по вектору, я имел в виду массивы. – Rafolks