C - >操作员在函数调用中冻结?

时间:2013-08-12 08:11:07

标签: c pointers record

对于编程作业,我应该创建一个模型学生数据库。要初始化数据库,我们必须编写一个函数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)语句但由于后一个问题而无法确定它是否有效。我是在正确的轨道上......还是什么?

2 个答案:

答案 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;
}