鱼C论坛

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

关于free内存释放

[复制链接]
发表于 2020-3-17 18:50:53 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 Cool_Breeze 于 2020-3-18 09:31 编辑
  1. #if 0
  2.         By Cool_Breeze
  3.         Rev 01
  4.         #endif

  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <malloc.h>
  9. #include <float.h>

  10. //返回文件指针
  11. FILE* filepointer(const char *file,const char *mode);
  12. /*
  13.         获取文件第一行项目名总数和最大项目名长度存入数组
  14.         注意里面有个temp数组大小为1024
  15. */
  16. void getitemsum(FILE* fp,int *itemsize);
  17. /*
  18.         获取文件第一行的项目名放入数组  
  19.         注意里面有个temp数组大小为1024
  20. */
  21. void getitemname(FILE* fp,char *name,int num);
  22. /*
  23.         读取每一行数据,按格式分割后放入指定数组
  24.         注意里面有个temp数组大小为1024
  25. */
  26. void getdata(FILE* fp,double* max,double* min,double* avg,double* sum,int itemnu);
  27. /*       
  28.         一下函数分析limit文件
  29.         分析limit文件信息
  30.         注意里面有个temp数组大小为1024
  31. */
  32. void getlimitsize(FILE* fp,int *itemsize);
  33. /*
  34.         分析limit文件信息
  35.         注意里面有个temp数组大小为1024
  36. */
  37. void getlimitdata(FILE* fp,int n,char* item,char* comp,double* data);
  38. //数据比较
  39. int compare(char *cmp,double s,double l);

  40. int main(int argc,char *argv[])
  41. {
  42.         //获取文件指针
  43.         FILE* sourcep=filepointer(argv[1],"rb");
  44.         FILE* limitp=filepointer(argv[2],"rb");
  45.         FILE* resultp=filepointer(argv[3],"wb");
  46.        
  47.         //source文件分析
  48.         //获取文件大小 itemsize[0]储存个数
  49.         static int itemsize[2];
  50.         getitemsum(sourcep,itemsize);
  51.         //开辟项目名空间并赋值
  52.         char (*itemname)[itemsize[1]]=(char(*)[itemsize[1]])calloc(itemsize[0],itemsize[1]*sizeof(char));
  53.         getitemname(sourcep,itemname[0],itemsize[1]);//源文件
  54.         //分配最大值,最小值,求和,平均值空间
  55.         double* max=(double*)calloc(itemsize[0],sizeof(double));
  56.         double* min=(double*)calloc(itemsize[0],sizeof(double));
  57.         double* avg=(double*)calloc(itemsize[0],sizeof(double));
  58.         double* sum=(double*)calloc(itemsize[0],sizeof(double));
  59.         //初始化最大值最小值
  60.         register int i=0;
  61.         for (i=0;i<itemsize[0];i++) *(min+i)=DBL_MAX, *(max+i)=DBL_MIN;
  62.         //获取相应数据
  63.         getdata(sourcep,max,min,avg,sum,itemsize[0]);
  64.         //source文件分析完成
  65.        
  66.         //开始limit文件分析
  67.         //获取文件大小 limitsize[0]储存个数
  68.         static int limitsize[2];
  69.         getlimitsize(limitp,limitsize);
  70.         //开辟项目名空间并赋值
  71.         char (*limititem)[limitsize[1]]=(char (*)[limitsize[1]])calloc(limitsize[0],sizeof(char)*limitsize[1]);
  72.         //注意:比较符号最多占2个字节,所以我给存储数组分配了3个字节空间
  73.         //存放比较符
  74.         char (*comp)[3]=(char (*)[3])calloc(limitsize[0],sizeof(char)*3);
  75.         //存放limit数据
  76.         double* data=(double*)calloc(limitsize[0],sizeof(double));
  77.         getlimitdata(limitp,limitsize[1],limititem[0],comp[0],data);
  78.         //limit文件分析完成
  79.          
  80.         //将source与limit比较
  81.         //打印结果
  82.         fprintf(resultp,"+-------------------------------------------+\r\n");
  83.         fprintf(resultp,"| %-41s |\r\n","Result");
  84.         fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
  85.         fprintf(resultp,"| Nu | %-36s | %-16s | Comp | %-16s | Result |\r\n","Item",argv[1],argv[2]);
  86.         fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
  87.         register int j=1;//源文件第一列忽略
  88.         int error=0;//退出值,0代表Pass ,非0代表Fail
  89.         for (i=0;i<limitsize[0];i++)
  90.         {
  91.                 for (j=1;j<itemsize[0];j++)
  92.                 {
  93.                         if ( ! strcmp(limititem[i],itemname[j]) )//匹配项目名
  94.                         {
  95.                                 if (! compare(comp[i],max[j],data[i]))
  96.                                 {
  97.                                         fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-4s | %-16.5lf |  Fail  |\r\n",j,limititem[i],max[j],comp[i],data[i]);
  98.                                         error++;
  99.                                 }
  100.                                 else fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-4s | %-16.5lf |  Pass  |\r\n",j,limititem[i],max[j],comp[i],data[i]);
  101.                         }
  102.                 }
  103.         }
  104.         fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
  105.        
  106.         //打印source和limit分析内容
  107.         fprintf(resultp,"\r\n");
  108.         fprintf(resultp,"+-------------------------------------------+\r\n");
  109.         fprintf(resultp,"| %-41s |\r\n",argv[2]);
  110.         fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
  111.         fprintf(resultp,"| Nu | %-36s | Comp | %-16s |\r\n","Item","Data");
  112.         fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
  113.         for (i=0;i<limitsize[0];i++) fprintf(resultp,"| %-2d | %-36s | %-4s | %-16.5f |\r\n",i+1,limititem[i],comp[i],data[i]);
  114.         fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
  115.         fprintf(resultp,"\r\n");
  116.         fprintf(resultp,"+-------------------------------------------+\r\n");
  117.         fprintf(resultp,"| %-41s |\r\n",argv[1]);
  118.         fprintf(resultp,"+----+--------------------------------------+------------------+------------------+------------------+------------------+\r\n");
  119.         fprintf(resultp,"| %-2s | %-36s | %-16s | %-16s | %-16s | %-16s |\r\n","Nu","Item","Max","Min","Sum","Avg");
  120.         fprintf(resultp,"+----+--------------------------------------+------------------+------------------+------------------+------------------+\r\n");
  121.         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]);
  122.         fprintf(resultp,"+----+--------------------------------------+------------------+------------------+------------------+------------------+\r\n");
  123.        
  124.         free(itemname);
  125.         free(max);
  126.         free(avg);
  127.         free(min);
  128.         free(sum);
  129.         free(limititem);
  130.         free(comp);
  131.         free(data);
  132.        
  133.         fclose(sourcep);
  134.         fclose(limitp);
  135.         fclose(resultp);
  136.         return error;
  137. }
  138. FILE* filepointer(const char *file,const char *mode)
  139. {
  140.         FILE *fp;
  141.         if (!(fp = fopen(file,mode)))
  142.         {
  143.                 printf("open fail! %s\n",file);
  144.                 exit(-2);
  145.         }
  146.         return fp;
  147. }
  148. /*
  149.         source文件分析
  150. */
  151. void getitemsum(FILE* fp,int *itemsize)
  152. {
  153.         char temp[1024]={"\0"};//临时储存一行数据
  154.         char *tep=temp;
  155.         register int i=0;//项目
  156.         register int m=0;//最大长度
  157.         register int t=0;//临时
  158.         fgets(temp,1024,fp);
  159.         for (;*tep;tep++)
  160.         {
  161.                 switch (*tep)
  162.                 {
  163.                         case ',': i++,t=0;break;//项目加一,长度归零
  164.                         case '\n': i++;*itemsize=i;*(itemsize+1)=m+1;return;//(m+1)给最后‘\0’留个位置,最后赋值退出
  165.                         default : t++;
  166.                         if (t>m) m=t;//始终保持最大长度
  167.                 }
  168.         }
  169. }
  170. void getitemname(FILE *fp,char *name,int num)
  171. {
  172.         rewind(fp);
  173.         char temp[1024]={"\0"};//临时储存一行数据
  174.         char *tep=temp;
  175.         register int i=0;//第一维
  176.         register int j=0;//第二维
  177.         fgets(temp,1024,fp);
  178.         for (;*tep;tep++)
  179.         {
  180.                 switch (*tep)
  181.                 {
  182.                         case ',':i++,j=0;break;
  183.                         case 10:break;//换行
  184.                         case 13:break;//回车
  185.                         default :*(name+i*num+j)=*tep;j++;
  186.                 }
  187.         }
  188. }
  189. void getdata(FILE* fp,double* max,double* min,double* avg,double* sum,int itemnu)
  190. {
  191.         rewind(fp);
  192.         char temp[1024]={"\0"};//临时储存一行数据
  193.         char *tep=temp;
  194.         register double fdata=0;//储存临时数据
  195.         register int i=1;//数组下标(空出第一列数据待后期使用)
  196.         register int count=0;//统计行数
  197.         fgets(tep,1024,fp);//跳过第一行项目数据
  198.         while ( !feof(fp) )
  199.         {
  200.                 count++;
  201.                 fgets(temp,1024,fp);
  202.                 i=1;
  203.                 tep=temp;
  204.                 while (*tep)
  205.                 {
  206.                         if (*(tep++) == ',')
  207.                         {
  208.                                 fdata=atof(tep);
  209.                                 if (fdata > *(max+i)) *(max+i)=fdata;
  210.                                 if (fdata < *(min+i)) *(min+i)=fdata;
  211.                                 *(sum+i) += fdata;
  212.                                 i++;
  213.                         }
  214.                 }
  215.         }
  216.         //处理最后一行因有可能出现不完整的数据所导致平均数据不准确
  217.         register int n;
  218.         if (i < itemnu)
  219.         {
  220.                 for (n=1;n<itemnu;n++)
  221.                 {
  222.                         if (n >= i) *(avg+n)=*(sum+n)/(count-1);
  223.                         else *(avg+n)=*(sum+n)/count;
  224.                 }
  225.         }
  226.         else for (n=1;n<itemnu;n++) *(avg+n)=*(sum+n)/count;
  227. }
  228. /*
  229.         limit文件分析
  230. */
  231. void getlimitsize(FILE* fp,int *itemsize)
  232. {
  233.         char temp[1024]={"\0"};//临时储存一行数据
  234.         char *tep=temp;
  235.         register int y=0;//项目
  236.         register int x=0;//最大长度
  237.         register int t=0;//临时
  238.         while (fgets(temp,1024,fp))//空行退出
  239.         {
  240.                 tep=temp;
  241.                 y++,t=1;
  242.                 for (;*tep != ',';tep++) t++;
  243.                 if ( t > x ) x = t;
  244.         }
  245.         itemsize[0]=y,itemsize[1]=x+1;//多计算一个给'\0'
  246. }
  247. void getlimitdata(FILE* fp,int nu,char* item,char* comp,double* data)
  248. {
  249.         rewind(fp);
  250.         static char temp[1024];
  251.         char *tep=temp;
  252.         register int yi=0;//item
  253.         register int yc=0;//comp
  254.         register int yd=0;//data
  255.         register int x=0;//字符数组的第一维
  256.         register int n=0;//表示‘,’出现的次数
  257.         while (fgets(temp,1024,fp))
  258.         {
  259.                 tep=temp;
  260.                 for (;*tep;tep++)
  261.                 {
  262.                         if (*tep == ',')
  263.                         {
  264.                                 n++;
  265.                                 x=0;
  266.                                 continue;
  267.                         }
  268.                         if (n==0)
  269.                         {
  270.                                 *(item+yi*nu+x)=*tep;x++;
  271.                         }
  272.                         else if (n==1)
  273.                         {
  274.                                 *(comp+yc*3+x)=*tep;x++;
  275.                         }
  276.                         else if (n==2)
  277.                         {
  278.                                 *(data+yd)=atof(tep);
  279.                                 yi++,yc++,yd++,n=0;break;
  280.                         }
  281.                 }
  282.         }
  283. }

  284. //数据比较
  285. int compare(char *cmp,double s,double l)
  286. {
  287.         if (! strcmp(cmp,"<")) return (s < l)? 1:0;
  288.         else if (! strcmp(cmp,">")) return (s > l)? 1:0;
  289.         else if (! strcmp(cmp,"=")) return (s = l)? 1:0;
  290.         else if (! strcmp(cmp,"<=")) return (s <= l)? 1:0;
  291.         else if (! strcmp(cmp,">=")) return (s >= l)? 1:0;
  292. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
首先,把这三个文件也发上来
还有,尽可能的解释一下这个题目

  1.         FILE* sourcep=filepointer(argv[1],"rb");
  2.         FILE* limitp=filepointer(argv[2],"rb");
  3.         FILE* resultp=filepointer(argv[3],"wb");
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2020-3-18 09:11:18 | 显示全部楼层
我改了这一段就好了!!!

  1. void getlimitdata(FILE* fp,int nu,char* item,char* comp,double* data)
  2. {
  3.         rewind(fp);
  4.         static char temp[1024];
  5.         char *tep=temp;
  6.         register int yi=0;//item
  7.         register int yc=0;//comp
  8.         register int yd=0;//data
  9.         register int x=0;//字符数组的第一维
  10.         register int n=0;//表示‘,’出现的次数
  11.         while (fgets(temp,1024,fp))
  12.         {
  13.                 tep=temp;
  14.                 for (;*tep;tep++)
  15.                 {
  16.                         if (*tep == ',')
  17.                         {
  18.                                 n++;
  19.                                 x=0;
  20.                                 continue;
  21.                         }
  22.                         if (n==0)
  23.                         {
  24.                                 *(item+yi*nu+x)=*tep;x++;
  25.                         }
  26.                         else if (n==1)
  27.                         {
  28.                                 *(comp+yc*3+x)=*tep;x++;
  29.                         }
  30.                         else if (n==2)
  31.                         {
  32.                                 *(data+yd)=atof(tep);
  33.                                 yi++,yc++,yd++,n=0;break;
  34.                         }
  35.                 }
  36.         }
  37. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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, 2024-6-2 18:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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