问题大体描述:
我在一个函数newRecord()中创建了一个结构体数组records[1000],返回records作为函数addRecordsToFile的参数。在addRecordsToFile函数里面引用结构体数组records的值是出现错误,只能引用records[0]的值,后面就报错了。 下面是两个函数的代码。
newRecord()函数,目的是返回records结构体数组的地址。
void* newRecord(struct FileState* file) { // 创建存储记录结构体的指针数组 struct Record records[1000]; int i; int recordSum=0; char cmd; int isFinish; FILE * outputStream; printf("文件名: %s\n",file->fileName) ; printf("科目总数: %d\n",file->subjectNum); printf("科目名称及对应的学分:"); for (i=0;i<file->subjectNum;i++) { // 输出科目信息及其学分 printf(" %s(%2.1f)",*(file->suject+i),*(file->weight+i)); } printf("\n"); printf("“姓名 性别 学号 科目成绩”格式输入记录,每条记录以回车结束\n"); do { scanf("%s%s%s",records[recordSum].name,records[recordSum].sex,records[recordSum].stuNum); records[recordSum].score=(float *)malloc(file->subjectNum*sizeof(float)); for (i=0;i<file->subjectNum;i++) { scanf("%f",records[recordSum].score+i); printf("score....%d==%2.1f\n",i,*(records[recordSum].score+i)); } printf("是否继续添加记录 Y/N"); getchar(); cmd=getchar(); if (cmd=='Y'||cmd=='y') { isFinish=0; } else if (cmd=='N'||cmd=='n') { isFinish=1; } recordSum++; if (recordSum>50) { // 越界处理 } } while (isFinish==0); // 在此处更新记录文件FileState结构体里面的recordSum if ((outputStream=fopen(file->fileName,"r+"))==NULL) { de_catcheErro("newRecord:...打开文件出错啦"); exit(0); } file->recordSum=file->recordSum+recordSum; printf("recordSum.....%d",file->recordSum); fwrite(file->fileName,sizeof(file->fileName),1,outputStream); fwrite(&(file->subjectNum),sizeof(file->subjectNum),1,outputStream); fwrite(&(file->recordSum),sizeof(file->recordSum),1,outputStream); //更新 fclose(outputStream); free(file); // 现在得到一个结构体的数组 return records; }
addRecordsToFile() 以上面函数返回的records作为参数,在函数中引用该数组的值。
void addRecordsToFile(const struct Record (*records)[1000],int resordSum,struct FileState * file) { FILE * outputStream; int i,j; if ((outputStream=fopen(file->fileName,"a+"))==NULL) { de_catcheErro("addRecordsToFile:...打开记录文件出错啦"); exit(0); } for (i=0;i<resordSum;i++) { printf("add start...\n"); fwrite(records[i]->name,10*sizeof(char),1,outputStream); printf("1.....%s\n",records[i]->name); fwrite(records[i]->sex,sizeof(records[i]->sex),1,outputStream); printf("2.....%s\n",records[i]->sex); fwrite(records[i]->stuNum,sizeof(records[i]->stuNum),1,outputStream); printf("3.....%s\n",records[i]->stuNum); fwrite(&(records[i]->raking),sizeof(records[i]->raking),1,outputStream); printf("4.....%d\n",records[i]->raking); fwrite(&(records[i]->weightScore),sizeof(records[i]->weightScore),1,outputStream); printf("5.....%f\n",records[i]->weightScore); for(j=0;j<file->subjectNum;j++) { printf("i=========%d,j========%d",i,j); printf("......%2.1f..\n",*(records[i]->score+j)); } } fclose(outputStream); }控制代码:
records=(struct Record (*)[])newRecord(file); //得到一个包含记录数组的指针 file=loadFile(*(fileList+fileNum-1)); //每次调用newRecord()后,file都会被释放,所以需要重新loadFile() addRecordsToFile(records,file->recordSum,file);
控制台的结果:
文件名: 成绩记录
科目总数: 2
科目名称及对应的学分: (1.0) 化学(1.0)
“姓名 性别 学号 科目成绩”格式输入记录,每条记录以回车结束
小李 男 01 99 88
score....0==99.0
score....1==88.0
是否继续添加记录 Y/Ny
小红 女 02 88 99
score....0==88.0
score....1==99.0
是否继续添加记录 Y/Ny
小明 男 03 89 78
score....0==89.0
score....1==78.0
是否继续添加记录 Y/Nn
recordSum.....43add start...
1.....小李
2.....男
3.....01
4.....-858993460
5.....-107374176.000000
i=========0,j========0......99.0..
i=========0,j========1......88.0..
add start...
1.....4?
2.....3
3.....
4.....-858993460
5.....-107374176.000000
i=========1,j========0请按任意键继续. . .
补充说明:
我现在在完成老师布置的学生管理系统,碰上了这个问题,想了好久还没解决。
struct Recordrecords[1000];是个临时变量,生命周期只在newRecords函数里。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。