我刚从C开始,对幕后的情况一无所知。我正在为一个数据结构类动态学习,这使事情变得更难。
更新:我已经将程序剥离下来,从内存和启动。我在那里有allocate和deallocate函数,得到了一个malloc错误:Q1(9882)malloc:*对象0x7fff59daec08的错误:未分配被释放的指针
*在malloc\u error\u break中设置要调试的断点
Update2这是我修改过的代码,它仍然缺少一些内容,我的printf语句没有出现:
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#include<assert.h>
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 < size; j++){
(students + 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 < size; x++){
printf("ID: %d\tScore: %d\n", (students + 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 < size; i++){
stud = &students[i];
sd[stud->id] = *stud;
}
for(int x = 0; x < size; x++){
printf("ID: %d\tScore: %d\n", (sd + 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]
等等。你也有同样的问题。相反,您需要使用一个不同的变量,比如
struct student* st = &students[x];
printf("id = %d\tscore = %d\n", st->id, st->score);
etc
还有,sd是干什么的?你似乎分配了一些空间,并没有明显的原因将学生复制到sd。分配的空间没有保存或返回。。。这是内存泄漏。哦,等等,我明白了。。你按照学生的身份重新排列学生的顺序,这样你就可以在完成后释放记忆。但是对于student和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);
}