对于编程作业,我应该创建一个模型学生数据库。要初始化数据库,我们必须编写一个函数InitDB
来分配所有内存等。这是我到目前为止为InitDB
写的内容:(包括struct
内容和{{1}以防万一)
main()
当我运行程序时,它冻结在typedef struct {
double mathGrade;
} stuDB;
typedef struct {
int numStudents;
stuDB students[MaxStudents];
} classDB;
main(){
int avGrade;
classDB *example;
InitDB(example);
//printf("Average class grade is %d\n",AvGrade(example)); <----ignore
getchar();
}
void InitDB(classDB *example){
int i=-1,numS;
printf("How many students?");
scanf("%d",&(example->numStudents);
stuDB *pstudents[numS]; //array of pointers to each student rec of type stuDB
do {
pstudents[i] = (stuDB *)malloc(sizeof(stuDB));
if(pstudents[i]==NULL) break;
i++;
} while(i<numS);
pstudents[0]->mathGrade = 42; //just for testing
pstudents[1]->mathGrade = 110;
}
的第3行,(InitDB
行)。当我说冻结时,我的意思是,如果我使scanf
的第二个参数不是指针变量,它的命令提示符会做同样的事情。但是scanf
应该已经是一个指针......对吗?所以我没有想法。为什么要这样做,我该如何解决?
另外,我不太确定我是否正确设置了&(example->numStudents)
语句但由于后一个问题而无法确定它是否有效。我是在正确的轨道上......还是什么?
答案 0 :(得分:5)
没有classDB的实例 - 只是指向classDB的指针。 将代码更改为 - :
classDB example;
InitDB(&example);
答案 1 :(得分:2)
#include<stdio.h>
// structure to hold mathgrade
typedef struct
{
double mathGrade;
}stuDB;
// structure to hold students and their grades
typedef struct
{
int numStudents; //no of students
stuDB students[]; //array of stuDB
}classDB;
int main()
{
classDB *example;
InitDB(&example);
printAvgDB(example);
return 0;
}
// Calculate Avg of all students and print it
void printAvgDB(classDB *example)
{
int i;
double avg=0.0;
for(i=0;i<example->numStudents;i++)
avg+=example->students[i].mathGrade;
printf("\nAverage: %lf",avg/example->numStudents);
}
// Initiate no of students and get their mathgrade
void InitDB(classDB **ex)
{
int i,numS;
printf("How many students?:");
scanf("%d",&numS);
// Allocate array size indirectly
classDB *example=(classDB *)malloc(sizeof(int)+numS*sizeof(stuDB));
example->numStudents=numS;
for(i=0;i<example->numStudents;i++)
{
printf("\nEnter math grade for student[%d]:",i+1);
scanf("%lf",&example->students[i].mathGrade);
}
*ex=example;
}