C语言,引用结构体数组出错

Callen 发布于 2013/12/01 17:31
阅读 832
收藏 0

问题大体描述:

    我在一个函数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请按任意键继续. . .



补充说明:

我现在在完成老师布置的学生管理系统,碰上了这个问题,想了好久还没解决。

加载中
0
祥子
祥子

struct Record records[1000]; 是个临时变量,生命周期只在newRecords函数里。


Callen
Callen
为什么这样不行 struct Record *records; record=(struct Record*)malloc(1000*sizeof(struct Record)); 然后将值写入 addRecordToFile(struct Record *records); addRecordToFile(records);
Callen
Callen
回复 @mobilefzb : 我在程序的目的就是想创建1000个Record结构体,将控制台输入的值写入内存,并且将数组的地址返回给addRecorsToFile函数,将数据写入文件
NickWilde
NickWilde
回复 @程序牛 : 可以看看堆栈的概念,你的数组其实是分配到栈空间上的。你要想有一个由你控制释放的内存空间要使用malloc/free分配到堆上去。
Callen
Callen
可是我很奇怪为什么records[0]有值。 现在C还有点不太熟,如果可以可以讲详细点。
0
horst_hu
horst_hu
楼上正解,简单作法,把它定义为全局变量,就ok了
0
修改登录密码
修改登录密码
做好动态申请 malloc
0
IAmWall
IAmWall
你分配的是临时变量,返回来也没用的,所以下个函数一旦引用就报错了
Callen
Callen
嗯,的确是定义成局部变量不妥。可是我还是很好奇为什么返回的指针能够引用数组的第一组数据呢?
0
mickelfeng
mickelfeng
定义为全局变量
返回顶部
顶部