1

对于编程任务,我应该创建一个模型学生数据库。要初始化数据库,我们必须编写一个函数InitDB来分配所有内存等。这是我到目前为止所写的内容InitDB:(包括这些struct东西,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;
}

当我运行程序时,它冻结在InitDB, (scanf行)的第 3 行。scanf当我说冻结时,我的意思是如果我将第二个参数设为非指针变量,它会执行与命令提示符相同的操作。但&(example->numStudents)应该已经是一个指针......对吧?所以我没有想法。为什么会这样,我该如何解决?

另外,我不太确定我malloc是否正确设置了语句,但由于后一个问题,我还没有真正看到它是否有效。我在正确的轨道上......还是什么?

4

2 回答 2

5

没有 classDB 的实例——只有一个指向 classDB 的指针。将代码更改为-:

   classDB example;
   InitDB(&example);
于 2013-08-12T08:13:36.563 回答
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;
}
于 2013-08-12T08:40:42.897 回答