用指针在C中排序结构

我刚刚从C开始,对幕后发生的事情一无所知。 我正在为数据结构类动态学习它,这使得事情变得更加艰难。

更新:我已经取消了该程序,并开始使用内存并启动。 我在那里有allocate和deallocate函数,我得到一个malloc错误:Q1(9882)malloc: *对象0x7fff59daec08的错误:没有分配被释放的指针*在malloc_error_break中设置一个断点来调试

Update2这里是我的修改后的代码,它仍然缺少一些东西,我的几个printf语句没有出现:

#include  #include #include #include static int size = 10; struct student{ int id; int score; }; struct student* allocate(){ /*Allocate memory for ten students*/ struct student *s = malloc(size*(sizeof(struct student))); assert(s != 0); /*return the pointer*/ return s; } void generate(struct student* students){ /*Generate random ID and scores for ten students, ID being between 1 and 10, scores between 0 and 100*/ srand((unsigned int)time(NULL)); int id[size]; int y; for (int i = 0; i < size; i++){ y = rand() % size + 1; while(dupe(id, i, y)){ y = rand() % size + 1; } id[i] = y; } for (int j = 0; j id = id[j]; (students + j)->score = rand() % 101; printf("ID: %d\tScore: %d\n", (students + j)->id, (students + j)->score); } } int dupe(int id[], int size1, int i){ for (int x = 0; x < size1; x++){ if(id[x] == i) return 1; } return 0; } void output(struct student* students){ /*Output information about the ten students in the format: ID1 Score1 ID2 score2 ID3 score3 ... ID10 score10*/ sort(&students); for(int x = 0; x id, (students + x)->score); //print stmt not showing } } void sort(struct student* students){ struct student *sd = allocate(); struct student *stud; for(int i = 0; i id] = *stud; } for(int x = 0; x id, (sd + x)->score); //print stmt not showing } students = &sd; deallocate(sd); } void summary(struct student* students){ /*Compute and print the minimum, maximum and average scores of the ten students*/ } void deallocate(struct student* stud){ /*Deallocate memory from stud*/ free(stud); } int main(){ struct student* stud = NULL; char c[] = "------------------------------\n"; /*call allocate*/ stud = allocate(); /*call generate*/ generate(&stud); /*call output*/ printf("%s", c); output(&stud); /*call summary*/ /*call deallocate*/ deallocate(stud); return 0; } 

 students = &students[x]; 

这会改变students指向的位置,因此下一次通过循环,你将从那里开始,而不是从一开始。 也就是说,你得到了originalstudents[0]originalstudents[1]originalstudents[1+2]originalstudents[1+2+3]等等。你和sd有同样的问题。

相反,你想使用一个不同的变量,如

 struct student* st = &students[x]; printf("id = %d\tscore = %d\n", st->id, st->score); etc 

另外,什么是sd? 你似乎没有明显的理由分配一些空间并将学生复制到sd。 分配的空间不会被保存或返回……这是内存泄漏。 哦,等等,我明白了……你按照他们的身份对sd的学生进行了重新排序。 所以你应该在完成后释放内存。 但是对于学生和sd,你需要一个指向数组的不同指针而不是数组元素。 您可以使用许多不同的命名约定,但最好使用一致的命名约定。 例如:

 void output(struct Student* students){ struct Student *idstudents = allocate(); /* sorted by id */ if (!idstudents) /* handle allocation error */; for (int x = 0; x < 10; x++){ struct Student* student = &students[x]; printf("id = %d\tscore = %d\n", student->id, student->score); struct Student* idstudent = &idstudents[student->id]; *idstudent = *student; /* copy all fields at once */ printf("id = %d\tscore = %d\n", idstudent->id, idstudent->score);/* pointless here, since we just printed the same info via student */ } for (int x = 0; x < 10; x++){ struct Student* idstudent = &idstudents[x]; printf("id = %d\tscore = %d\n", idstudent->id, idstudent->score); } deallocate(idstudents); } 

你的output()函数误用了指针,所以你正在践踏你的学生数据。 尝试这样的事情(假设ID是数组索引,因为这是你使用它们的方式):

 struct student* allocate() { /*Allocate memory for ten students*/ struct student *s = malloc(10 * sizeof(struct student)); assert(s != NULL); /*return the pointer*/ return s; } void deallocate(struct student* stud) { /*Deallocate memory from stud*/ free(stud); } int main() { struct student* stud = NULL; /*call allocate*/ stud = allocate(); /*call generate*/ /*call output*/ output(stud); /*call summary*/ /*call deallocate*/ deallocate(stud); return 0; } void output(struct student* students) { /*allocate array for sorting*/ struct student *sd = allocate(); struct student *stud; /*make copy of students in sorted order*/ for (int x = 0; x < 10; ++x) { stud = &students[x]; printf("id = %d\tscore = %d\n", stud->id, stud->score); sd[stud->id] = *stud; } /*output sorted students*/ for (int x = 0; x < 10; ++x) { stud = &sd[x]; printf("id = %d\tscore = %d\n", stud->id, stud->score); } /*deallocate array for sorting*/ deallocate(sd); } 

由于您已经对学生数量进行了硬编码,因此您无需在output()动态分配新的学生数组,只需对原始数组中已有的指针进行排序:

 void output(struct student* students) { /*array for sorting*/ struct student* sd[10]; struct student *stud; /*sort students*/ for (int x = 0; x < 10; ++x) { stud = &students[x]; printf("id = %d\tscore = %d\n", stud->id, stud->score); sd[stud->id] = stud; } /*output sorted students*/ for (int x = 0; x < 10; ++x) { stud = sd[x]; printf("id = %d\tscore = %d\n", stud->id, stud->score); } } 

更新 :既然您已经展示了更多代码,那么您仍然会在指针中犯下一些重大错误。 正如您所展示的那样,您的代码甚至不应该编译。 试试这个:

 #include  #include  #include  #include  static const int numStudents = 10; struct student { int id; int score; }; struct student* allocate() { /*Allocate memory for ten students*/ struct student *s = malloc(numStudents * sizeof(struct student)); assert(s != 0); /*return the pointer*/ return s; } void generate(struct student* students) { /*Generate random ID and scores for ten students, ID being between 1 and 10, scores between 0 and 100*/ int id[numStudents]; int y; struct student* stud; for (int i = 0; i < numStudents; i++) { do { y = rand() % size + 1; } while (dupe(id, i, y) != 0); id[i] = y; } for (int j = 0; j < numStudents; j++) { stud = &students[j]; stud->id = id[j]; stud->score = rand() % 101; } } int dupe(int id[], int size, int i) { for (int x = 0; x < size; x++) { if (id[x] == i) return 1; } return 0; } void output(struct student* students) { /*Output information about the students in the format: ID1 Score1 ID2 score2 ID3 score3 ... ID10 score10*/ struct student* stud; for(int x = 0; x < numStudents; x++) { stud = &students[x]; printf("ID: %d\tScore: %d\n", stud->id, stud->score); } } void sort(struct student* students) { struct student *sd = allocate(); struct student *stud; for(int i = 0; i < numStudents; i++) { stud = &students[i]; sd[stud->id - 1] = *stud; } for(int x = 0; x < numStudents; x++) { stud = &sd[x]; students[x] = *stud; } deallocate(sd); } void summary(struct student* students) { /*Compute and print the minimum, maximum and average scores of the ten students*/ } void deallocate(struct student* stud) { /*Deallocate memory from stud*/ free(stud); } int main() { /*seed random number generator*/ srand(time(NULL)); struct student* stud = NULL; const char* c = "------------------------------\n"; /*allocate students and generate info*/ stud = allocate(); generate(stud); output(stud); printf("%s", c); /*sort students*/ sort(students); output(stud); printf("%s", c); /*display summary*/ summary(stud); /*deallocate students*/ deallocate(stud); return 0; } 

这个说法

 students = &students[x]; 

修改传入的参数。 你已经失去了’学生’指出的东西,这是struct student []的开始。

删除此语句并尝试再次运行程序。

还有其他错误,但这应该会让你失望。

指针很难。