鱼C论坛

 找回密码
 立即注册
查看: 1095|回复: 8

关于free内存释放

[复制链接]
发表于 2020-3-17 18:50:53 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 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[1],"rb");
        FILE* limitp=filepointer(argv[2],"rb");
        FILE* resultp=filepointer(argv[3],"wb");
        
        //source文件分析 
        //获取文件大小 itemsize[0]储存个数 
        static int itemsize[2];
        getitemsum(sourcep,itemsize);
        //开辟项目名空间并赋值 
        char (*itemname)[itemsize[1]]=(char(*)[itemsize[1]])calloc(itemsize[0],itemsize[1]*sizeof(char));
        getitemname(sourcep,itemname[0],itemsize[1]);//源文件 
        //分配最大值,最小值,求和,平均值空间
        double* max=(double*)calloc(itemsize[0],sizeof(double));
        double* min=(double*)calloc(itemsize[0],sizeof(double));
        double* avg=(double*)calloc(itemsize[0],sizeof(double));
        double* sum=(double*)calloc(itemsize[0],sizeof(double));
        //初始化最大值最小值 
        register int i=0;
        for (i=0;i<itemsize[0];i++) *(min+i)=DBL_MAX, *(max+i)=DBL_MIN;
        //获取相应数据
        getdata(sourcep,max,min,avg,sum,itemsize[0]);
        //source文件分析完成 
        
        //开始limit文件分析
        //获取文件大小 limitsize[0]储存个数 
        static int limitsize[2];
        getlimitsize(limitp,limitsize);
        //开辟项目名空间并赋值 
        char (*limititem)[limitsize[1]]=(char (*)[limitsize[1]])calloc(limitsize[0],sizeof(char)*limitsize[1]);
        //注意:比较符号最多占2个字节,所以我给存储数组分配了3个字节空间 
        //存放比较符 
        char (*comp)[3]=(char (*)[3])calloc(limitsize[0],sizeof(char)*3);
        //存放limit数据
        double* data=(double*)calloc(limitsize[0],sizeof(double));
        getlimitdata(limitp,limitsize[1],limititem[0],comp[0],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[1],argv[2]);
        fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
        register int j=1;//源文件第一列忽略 
        int error=0;//退出值,0代表Pass ,非0代表Fail 
        for (i=0;i<limitsize[0];i++)
        {
                for (j=1;j<itemsize[0];j++)
                {
                        if ( ! strcmp(limititem[i],itemname[j]) )//匹配项目名 
                        {
                                if (! compare(comp[i],max[j],data[i]))
                                {
                                        fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-4s | %-16.5lf |  Fail  |\r\n",j,limititem[i],max[j],comp[i],data[i]);
                                        error++;
                                }
                                else fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-4s | %-16.5lf |  Pass  |\r\n",j,limititem[i],max[j],comp[i],data[i]);
                        }
                }
        }
        fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
        
        //打印source和limit分析内容
        fprintf(resultp,"\r\n");
        fprintf(resultp,"+-------------------------------------------+\r\n");
        fprintf(resultp,"| %-41s |\r\n",argv[2]);
        fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
        fprintf(resultp,"| Nu | %-36s | Comp | %-16s |\r\n","Item","Data");
        fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
        for (i=0;i<limitsize[0];i++) fprintf(resultp,"| %-2d | %-36s | %-4s | %-16.5f |\r\n",i+1,limititem[i],comp[i],data[i]);
        fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
        fprintf(resultp,"\r\n");
        fprintf(resultp,"+-------------------------------------------+\r\n");
        fprintf(resultp,"| %-41s |\r\n",argv[1]);
        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[0];i++) fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-16.5lf | %-16.5lf | %-16.5lf |\r\n",i,*(itemname+i),max[i],min[i],sum[i],avg[i]);
        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[1024]={"\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[1024]={"\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[1024]={"\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[1024]={"\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[0]=y,itemsize[1]=x+1;//多计算一个给'\0'
}
void getlimitdata(FILE* fp,int nu,char* item,char* comp,double* data)
{
        rewind(fp);
        static char temp[1024];
        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;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-17 18:53:58 | 显示全部楼层
        #if 0
        以下除了标记出来的,其他释放都没问题,
        屏蔽这一段内存释放程序也能运行,结果正确,但是连续运行就会程序就会终止,是不是内存泄露了?
        搞了半天了,百度也查了,指针是指向内存的开始没有指向其他地方,还是释放不了这2个空间
        free(itemname);
        free(max);
        free(avg);
        free(min);
        free(sum);
        free(limititem);//释放这个内存程序就终止
        free(comp);
        free(data);//释放这个内存程序就终止
        #endif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-17 19:32:10 | 显示全部楼层
这个程序在32位的系统上却不会终止,可以连续运行。太难了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-17 19:49:02 | 显示全部楼层
在w10上面也可以,我服了,这个什么逻辑啊!!
W7 64位就不行。Dev-C++编译器
同样的编译器却大不相同!
我这个代码兼容性那么差吗???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 20:36:32 | 显示全部楼层
首先,把这三个文件也发上来
还有,尽可能的解释一下这个题目
        FILE* sourcep=filepointer(argv[1],"rb");
        FILE* limitp=filepointer(argv[2],"rb");
        FILE* resultp=filepointer(argv[3],"wb");
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 23:06:30 | 显示全部楼层
太长了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-18 09:11:18 | 显示全部楼层
我改了这一段就好了!!!
void getlimitdata(FILE* fp,int nu,char* item,char* comp,double* data)
{
        rewind(fp);
        static char temp[1024];
        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;
                        }
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-20 10:36:06 | 显示全部楼层
都是大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-21 00:23:53 | 显示全部楼层

简单的,会一些基础语法你也可以的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 20:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表