关于free内存释放
本帖最后由 Cool_Breeze 于 2020-3-18 09:31 编辑#if 0
By Cool_Breeze
Rev 01
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <float.h>
//返回文件指针
FILE* filepointer(const char *file,const char *mode);
/*
获取文件第一行项目名总数和最大项目名长度存入数组
注意里面有个temp数组大小为1024
*/
void getitemsum(FILE* fp,int *itemsize);
/*
获取文件第一行的项目名放入数组
注意里面有个temp数组大小为1024
*/
void getitemname(FILE* fp,char *name,int num);
/*
读取每一行数据,按格式分割后放入指定数组
注意里面有个temp数组大小为1024
*/
void getdata(FILE* fp,double* max,double* min,double* avg,double* sum,int itemnu);
/*
一下函数分析limit文件
分析limit文件信息
注意里面有个temp数组大小为1024
*/
void getlimitsize(FILE* fp,int *itemsize);
/*
分析limit文件信息
注意里面有个temp数组大小为1024
*/
void getlimitdata(FILE* fp,int n,char* item,char* comp,double* data);
//数据比较
int compare(char *cmp,double s,double l);
int main(int argc,char *argv[])
{
//获取文件指针
FILE* sourcep=filepointer(argv,"rb");
FILE* limitp=filepointer(argv,"rb");
FILE* resultp=filepointer(argv,"wb");
//source文件分析
//获取文件大小 itemsize储存个数
static int itemsize;
getitemsum(sourcep,itemsize);
//开辟项目名空间并赋值
char (*itemname)]=(char(*)])calloc(itemsize,itemsize*sizeof(char));
getitemname(sourcep,itemname,itemsize);//源文件
//分配最大值,最小值,求和,平均值空间
double* max=(double*)calloc(itemsize,sizeof(double));
double* min=(double*)calloc(itemsize,sizeof(double));
double* avg=(double*)calloc(itemsize,sizeof(double));
double* sum=(double*)calloc(itemsize,sizeof(double));
//初始化最大值最小值
register int i=0;
for (i=0;i<itemsize;i++) *(min+i)=DBL_MAX, *(max+i)=DBL_MIN;
//获取相应数据
getdata(sourcep,max,min,avg,sum,itemsize);
//source文件分析完成
//开始limit文件分析
//获取文件大小 limitsize储存个数
static int limitsize;
getlimitsize(limitp,limitsize);
//开辟项目名空间并赋值
char (*limititem)]=(char (*)])calloc(limitsize,sizeof(char)*limitsize);
//注意:比较符号最多占2个字节,所以我给存储数组分配了3个字节空间
//存放比较符
char (*comp)=(char (*))calloc(limitsize,sizeof(char)*3);
//存放limit数据
double* data=(double*)calloc(limitsize,sizeof(double));
getlimitdata(limitp,limitsize,limititem,comp,data);
//limit文件分析完成
//将source与limit比较
//打印结果
fprintf(resultp,"+-------------------------------------------+\r\n");
fprintf(resultp,"| %-41s |\r\n","Result");
fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
fprintf(resultp,"| Nu | %-36s | %-16s | Comp | %-16s | Result |\r\n","Item",argv,argv);
fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
register int j=1;//源文件第一列忽略
int error=0;//退出值,0代表Pass ,非0代表Fail
for (i=0;i<limitsize;i++)
{
for (j=1;j<itemsize;j++)
{
if ( ! strcmp(limititem,itemname) )//匹配项目名
{
if (! compare(comp,max,data))
{
fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-4s | %-16.5lf |Fail|\r\n",j,limititem,max,comp,data);
error++;
}
else fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-4s | %-16.5lf |Pass|\r\n",j,limititem,max,comp,data);
}
}
}
fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
//打印source和limit分析内容
fprintf(resultp,"\r\n");
fprintf(resultp,"+-------------------------------------------+\r\n");
fprintf(resultp,"| %-41s |\r\n",argv);
fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
fprintf(resultp,"| Nu | %-36s | Comp | %-16s |\r\n","Item","Data");
fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
for (i=0;i<limitsize;i++) fprintf(resultp,"| %-2d | %-36s | %-4s | %-16.5f |\r\n",i+1,limititem,comp,data);
fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
fprintf(resultp,"\r\n");
fprintf(resultp,"+-------------------------------------------+\r\n");
fprintf(resultp,"| %-41s |\r\n",argv);
fprintf(resultp,"+----+--------------------------------------+------------------+------------------+------------------+------------------+\r\n");
fprintf(resultp,"| %-2s | %-36s | %-16s | %-16s | %-16s | %-16s |\r\n","Nu","Item","Max","Min","Sum","Avg");
fprintf(resultp,"+----+--------------------------------------+------------------+------------------+------------------+------------------+\r\n");
for (i=1;i<itemsize;i++) fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-16.5lf | %-16.5lf | %-16.5lf |\r\n",i,*(itemname+i),max,min,sum,avg);
fprintf(resultp,"+----+--------------------------------------+------------------+------------------+------------------+------------------+\r\n");
free(itemname);
free(max);
free(avg);
free(min);
free(sum);
free(limititem);
free(comp);
free(data);
fclose(sourcep);
fclose(limitp);
fclose(resultp);
return error;
}
FILE* filepointer(const char *file,const char *mode)
{
FILE *fp;
if (!(fp = fopen(file,mode)))
{
printf("open fail! %s\n",file);
exit(-2);
}
return fp;
}
/*
source文件分析
*/
void getitemsum(FILE* fp,int *itemsize)
{
char temp={"\0"};//临时储存一行数据
char *tep=temp;
register int i=0;//项目
register int m=0;//最大长度
register int t=0;//临时
fgets(temp,1024,fp);
for (;*tep;tep++)
{
switch (*tep)
{
case ',': i++,t=0;break;//项目加一,长度归零
case '\n': i++;*itemsize=i;*(itemsize+1)=m+1;return;//(m+1)给最后‘\0’留个位置,最后赋值退出
default : t++;
if (t>m) m=t;//始终保持最大长度
}
}
}
void getitemname(FILE *fp,char *name,int num)
{
rewind(fp);
char temp={"\0"};//临时储存一行数据
char *tep=temp;
register int i=0;//第一维
register int j=0;//第二维
fgets(temp,1024,fp);
for (;*tep;tep++)
{
switch (*tep)
{
case ',':i++,j=0;break;
case 10:break;//换行
case 13:break;//回车
default :*(name+i*num+j)=*tep;j++;
}
}
}
void getdata(FILE* fp,double* max,double* min,double* avg,double* sum,int itemnu)
{
rewind(fp);
char temp={"\0"};//临时储存一行数据
char *tep=temp;
register double fdata=0;//储存临时数据
register int i=1;//数组下标(空出第一列数据待后期使用)
register int count=0;//统计行数
fgets(tep,1024,fp);//跳过第一行项目数据
while ( !feof(fp) )
{
count++;
fgets(temp,1024,fp);
i=1;
tep=temp;
while (*tep)
{
if (*(tep++) == ',')
{
fdata=atof(tep);
if (fdata > *(max+i)) *(max+i)=fdata;
if (fdata < *(min+i)) *(min+i)=fdata;
*(sum+i) += fdata;
i++;
}
}
}
//处理最后一行因有可能出现不完整的数据所导致平均数据不准确
register int n;
if (i < itemnu)
{
for (n=1;n<itemnu;n++)
{
if (n >= i) *(avg+n)=*(sum+n)/(count-1);
else *(avg+n)=*(sum+n)/count;
}
}
else for (n=1;n<itemnu;n++) *(avg+n)=*(sum+n)/count;
}
/*
limit文件分析
*/
void getlimitsize(FILE* fp,int *itemsize)
{
char temp={"\0"};//临时储存一行数据
char *tep=temp;
register int y=0;//项目
register int x=0;//最大长度
register int t=0;//临时
while (fgets(temp,1024,fp))//空行退出
{
tep=temp;
y++,t=1;
for (;*tep != ',';tep++) t++;
if ( t > x ) x = t;
}
itemsize=y,itemsize=x+1;//多计算一个给'\0'
}
void getlimitdata(FILE* fp,int nu,char* item,char* comp,double* data)
{
rewind(fp);
static char temp;
char *tep=temp;
register int yi=0;//item
register int yc=0;//comp
register int yd=0;//data
register int x=0;//字符数组的第一维
register int n=0;//表示‘,’出现的次数
while (fgets(temp,1024,fp))
{
tep=temp;
for (;*tep;tep++)
{
if (*tep == ',')
{
n++;
x=0;
continue;
}
if (n==0)
{
*(item+yi*nu+x)=*tep;x++;
}
else if (n==1)
{
*(comp+yc*3+x)=*tep;x++;
}
else if (n==2)
{
*(data+yd)=atof(tep);
yi++,yc++,yd++,n=0;break;
}
}
}
}
//数据比较
int compare(char *cmp,double s,double l)
{
if (! strcmp(cmp,"<")) return (s < l)? 1:0;
else if (! strcmp(cmp,">")) return (s > l)? 1:0;
else if (! strcmp(cmp,"=")) return (s = l)? 1:0;
else if (! strcmp(cmp,"<=")) return (s <= l)? 1:0;
else if (! strcmp(cmp,">=")) return (s >= l)? 1:0;
} #if 0
以下除了标记出来的,其他释放都没问题,
屏蔽这一段内存释放程序也能运行,结果正确,但是连续运行就会程序就会终止,是不是内存泄露了?
搞了半天了,百度也查了,指针是指向内存的开始没有指向其他地方,还是释放不了这2个空间
free(itemname);
free(max);
free(avg);
free(min);
free(sum);
free(limititem);//释放这个内存程序就终止
free(comp);
free(data);//释放这个内存程序就终止
#endif 这个程序在32位的系统上却不会终止,可以连续运行。太难了! 在w10上面也可以,我服了,这个什么逻辑啊!!
W7 64位就不行。Dev-C++编译器
同样的编译器却大不相同!
我这个代码兼容性那么差吗???
{:5_99:} 首先,把这三个文件也发上来
还有,尽可能的解释一下这个题目
FILE* sourcep=filepointer(argv,"rb");
FILE* limitp=filepointer(argv,"rb");
FILE* resultp=filepointer(argv,"wb"); 太长了 我改了这一段就好了!!!{:5_99:}
void getlimitdata(FILE* fp,int nu,char* item,char* comp,double* data)
{
rewind(fp);
static char temp;
char *tep=temp;
register int yi=0;//item
register int yc=0;//comp
register int yd=0;//data
register int x=0;//字符数组的第一维
register int n=0;//表示‘,’出现的次数
while (fgets(temp,1024,fp))
{
tep=temp;
for (;*tep;tep++)
{
if (*tep == ',')
{
n++;
x=0;
continue;
}
if (n==0)
{
*(item+yi*nu+x)=*tep;x++;
}
else if (n==1)
{
*(comp+yc*3+x)=*tep;x++;
}
else if (n==2)
{
*(data+yd)=atof(tep);
yi++,yc++,yd++,n=0;break;
}
}
}
} 都是大佬 Itachi30143014 发表于 2020-3-20 10:36
都是大佬
简单的,会一些基础语法你也可以的!
页:
[1]