请教一个 free 函数的问题
程序代码:
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> int str_to_num(char *str,int n); //转化字符串为数字 void strs_to_nums(char *str,int *data,int n); //转化字符串为数字组 void nums_to_strs(int *num,char *string); //转换字符组为字符串 void function(int countA,int countB,int flag,int n,int i); //程序的核心,猜解蝈蝈的计分 int arrary[5][4]; //记录猜解过程的轨迹数组 int *data; int arrary1[5][2]; //记录猜解成功结果的数组 int _tmain(int argc, _TCHAR* argv[]) { FILE *fpin,*fpout; char str[10], *datastring; int num1=0,num2,flag,counta,countb,i; fpin=fopen("c:\\ponit.in","r"); if(fpin==NULL){ printf("打开数据文件失败!"); exit(0); } fpout=fopen("c:\\ponit.out","w+"); if(fpout==NULL){ printf("打开记录结果文件失败!"); exit(0); } fgets(str,5,fpin); num1=str_to_num(str,5); //printf("%d\n",num1); while(num1-->0){ memset(arrary,0,80); //每一数据集合处理完后对数据空间清零,防止垃圾数据对程序造成影响 memset(arrary1,0,40); fgets(str,10,fpin); num2=str_to_num(str,10); datastring=(char*)malloc(sizeof(char)*2*num2+2); data=(int*)malloc(sizeof(int)*num2); fgets(datastring,2*num2+2,fpin); strs_to_nums(datastring,data,num2); //上面到这是从文本中提取数据组的过程,到这 程序的数据准备好 free(datastring); flag=0;counta=0;countb=0;i=0; function(counta,countb,flag,num2-1,i); //进入猜解过程 if(!((arrary[2][3]==1&&arrary[4][3]==0)||(arrary[2][3]==0&&arrary[4][3]==1))) //猜解为5局3胜制 当多次猜解为3局胜利或者多次我5局胜利 fputs("unknow\n",fpout); //或者1次3局胜利,一次5局胜利的情况或者根本就没猜解出来 为 unknow //printf("unkonw"); else{ datastring=(char*)malloc(sizeof(char)*20); for(i=0;arrary1[i][0]!=0&&i<5;i++){ //printf("%d %d\n",arrary1[i][0],arrary1[i][1]); nums_to_strs(arrary1[i],datastring); fputs(datastring,fpout); } free(datastring); } free(data); //free(data); // 加上这两句程序会崩溃 //free(datastring); } getchar(); fclose(fpin); fclose(fpout); return 0; } int str_to_num(char *str,int n) { int i=0,num=0; for(;i<n;i++){ if(str[i]=='\n'||str[i]=='\0') break; num=num*10+str[i]-'0'; //printf("%x\n",str[i]); } return num; } void strs_to_nums(char *str,int *data,int n) { int i=0; for(;i<n;i++){ if(str[2*i]=='X') data[i]=10; else data[i]=str[2*i]-'0'; //printf("%c ",str[2*i]); } } void nums_to_strs(int *num,char *string) { int i,j=0,k=0; char p[8]; while(k<2){ itoa(num[k],p,10); for(i=0;i<8;i++){ if(p[i]=='\0') break; string[j]=p[i]; j++; } if(k==0){ string[j]=':'; j++; } k++; } string[j]='\n'; string[j+1]='\0'; } void function(int countA,int countB,int flag,int n,int i) { int j,count=0; for(j=n;j>=0;j--){ if(arrary[2][3]>1) return; if(arrary[4][3]>1) return; if(arrary[2][3]==1&&arrary[4][3]==1) return; if(flag==0) { countA+=data[j]; flag=1; } else{ countB+=data[j]; flag=0; } if ((countA==21&&countB<=19) || (countA>21 && (countA-countB==2))){ // if(flag==1){ arrary[i][0]=countA; arrary[i][1]=countB; //} //else{ // arrary[i][0]=countB; // arrary[i][1]=countA; //} if(j==0){ if(i==2||i==4){ arrary[i][3]+=1; if((arrary[2][3]==1&&arrary[4][3]==0)||(arrary[2][3]==0&&arrary[4][3]==1)) for(j=i;j>=0;j--){ arrary1[i-j][0]=arrary[j][0]; arrary1[i-j][1]=arrary[j][1]; } } // else // printf("unkonowA\n"); return; } function(0,0,0,j-1,i+1); // printf("%d ",j-1); //memset(arrary[i],0,4); // return; } if ((countA>=21&&(countA-countB<-1)&&flag==1&&data[j-1]!=10) || (countA>21&&(countA-countB>2)&&flag==0&&data[j-1]!=10)){ //memset(arrary[i],0,4); return; } if(j==0){//memset(arrary,0,20); return;} if(j>0&&data[j-1]==10){ function(countA,countB,flag,j-1,i); if(flag==0) flag=1; else flag=0; function(countA,countB,flag,j-1,i); } } }
程序加上两个free()后程序会崩溃 求解释
下面是供程序使用的两文件,放在C盘根目录下就可以运行了
Desktop.rar
(613 Bytes)
[ 本帖最后由 zhu224039 于 2014-6-29 03:36 编辑 ]