标题:各位lz帮我看下为什么free()函数放在do while()循环用不了
只看楼主
啊蒋
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-2-26
结帖率:70%
已结贴  问题点数:20 回复次数:10 
各位lz帮我看下为什么free()函数放在do while()循环用不了
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct word word;
struct word
{
  char* pword;
  unsigned int count;
  word* pnext;
};
 
int main()
 {
word* pfirst=NULL;
 word* pcurrent=NULL;
 word* previous=NULL;
#define BUF_LEN 101
#define START 100
#define WORD 20
      word* ptemp=NULL;
   char buf[BUF_LEN];
   char delimites[]=" \n\".,;!?)(";
   size_t str_size=START;
       size_t word_max=20;
  unsigned    int word_count=0;
  unsigned int i=0;
    size_t word_length=0;
  char ch='y';
    int a=0;
    int flag=0;
    char* pstr=NULL;
    char* pbuf=NULL;

  while(ch=='y')
  {
    pbuf=(char*)calloc(str_size,sizeof(char));
   
   if(!pbuf)
   {
    printf("内存分配出现错误");
    return 1;
   }
   *pbuf='\0';
  
    fflush(stdin);
   printf("请每行输入最多%d字符,\n""结束输入通过按一个空行",BUF_LEN-1);

    while(a==0)
    {
     if(! fgets(buf,sizeof(buf),stdin))
     {
         printf("请错误:");
         return 9;
     }
      if(buf[0]=='\n')
       break;
      
     if(! strcat(pbuf,buf))
      printf("连接错误:");
     }
   
    pstr=strtok(pbuf,delimites);
    printf("正确");
    if(!pstr)
     {
      printf("没找到");
      return 2;
     }
     while(pstr)
      {
         
           
            pcurrent=pfirst;
                 
      
            while(pcurrent)
            {
                if(strcmp(pcurrent->pword,pstr)==0)
                {
                 flag=1;
                 ++pcurrent->count;
                 break;
                }
            pcurrent=pcurrent->pnext;
            flag=0;
            }
      
        
        if(flag==0)
        {
            
         pcurrent=(word*)calloc(1,sizeof(word));
   
          if(! pcurrent)
          {
           printf("分配内存错误");
           return 1;
          }
          word_length=10;
          if(!pfirst)
           pfirst=previous=pcurrent;
          else
          {
            previous->pnext=pcurrent;
            previous=pcurrent;
          }
      
          pcurrent->pword=calloc(word_length,sizeof(char));
          strcpy(pcurrent->pword,pstr);
          pcurrent->count=1;
          pcurrent->pnext=NULL;
          ++word_count;
      
        }
     
       pstr=strtok(NULL,delimites);
     }
    pcurrent=pfirst;
    i=0;
    while(pcurrent)
    {
      printf("%s %d",pcurrent->pword,pcurrent->count);
      pcurrent=pcurrent->pnext;
      i++;
      if(i%4==0)
        printf("\n");
    }
      
        free(pbuf);
        pbuf=NULL;
     



    pcurrent=pfirst;
    while(pcurrent)
    {
     
      free(pcurrent->pword);
      pcurrent->pword=NULL;
      ptemp=pcurrent;
       pcurrent=pcurrent->pnext;

      free(ptemp);
      ptemp=NULL;
      
    }

    printf("还想在来一次吗(y继续n退出)");
    scanf("%c",&ch);
   }
      
 
 
  return 0;
}
搜索更多相关主题的帖子: previous include count 
2017-02-26 23:53
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:20 
没电脑~没去调试代码~

感觉原因在这里~

          if(!pfirst)
           pfirst=previous=pcurrent;
          else
          {
            previous->pnext=pcurrent;
            previous=pcurrent;
          }

第一次free时pfirst不等于NULL~free后要及时把pfirst重置为NULL~不知道还有没有其它问题~可以先去调试一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-27 07:33
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
代码写得很严谨~如果没有猜错~这个应该是统计各个单词出现的次数的吧~记得初学链表的时候看到个类似的~不过那时水平不够就没怎么在意了~现在看了也学到了不少实用性知识~这代码有种面向对象的味道~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-27 07:41
啊蒋
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-2-26
得分:0 
回复 2楼 九转星河
好的我晚上回去在改改,第一次是能通过的,第二次运行就出问题了
2017-02-27 09:27
啊蒋
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-2-26
得分:0 
回复 2楼 九转星河
好的我晚上回去在改改,第一次是能通过的,第二次运行就出问题了
2017-02-27 09:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 5楼 啊蒋
第一次没有问题但第二次出问题凭经验明显是数据重置出了问题~倒不如每次结束数据时直接调用函数在外面加个while循环结构~每次开始函数就先初始化相关变量~函数结束后除了堆里面的和静态变量都释放了~这样比较省事~

do{fun(……)……}while(ch!='n');

猜测楼主不调用函数进行模块分割的原因是要调用的参数太多了……但用多个函数进行模块分割的话感觉可读性和维护性更强~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-27 11:24
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
程序代码:
word* pfirst=NULL;

 word* pcurrent=NULL;

 word* previous=NULL;
#define BUF_LEN 101
#define START 100
#define WORD 20
      word* ptemp=NULL;
   char buf[BUF_LEN];
   char delimites[]=" \n\".,;!?)(";
   size_t str_size=START;
       size_t word_max=20;
  unsigned    int word_count=0;
  unsigned int i=0;
    size_t word_length=0;
  char ch='y';
    int a=0;
    int flag=0;
    char* pstr=NULL;
    char* pbuf=NULL;


或许~更直接的是把这行代码除了宏定义写进第一个while里面试试~

[此贴子已经被作者于2017-2-27 11:28编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-27 11:27
啊蒋
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-2-26
得分:0 
回复 7楼 九转星河
按照你说的是试了下,已经可以了,有个地方我想不明白,在第一次while(ch=‘y’)循环的时候我不是已经free(pbuf);且设置成pbuf=null;也free(ptemp)ptemp=null;因为我第一次循环已经把这个两个指针不是设置成null了吗,为什么在第二次循环开始的时候还要把他们设置成char* pbuf=null;word* ptemp=pbuf=null;
2017-02-27 21:23
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 8楼 啊蒋
在没有调试的情况下~还好盲改改没有改错~~~~~


以下是引用啊蒋在2017-2-27 21:23:45的发言:

按照你说的是试了下,已经可以了,有个地方我想不明白,在第一次while(ch=‘y’)循环的时候我不是已经free(pbuf);且设置成pbuf=null;也free(ptemp)ptemp=null;因为我第一次循环已经把这个两个指针不是设置成null了吗,为什么在第二次循环开始的时候还要把他们设置成char* pbuf=null;word* ptemp=pbuf=null;


这是一种保险的做法~当然如果你对自己设计的程序了如指掌的话把关键变量设为NULL就可以了~

总之~不管怎么设置~~~能正常运行就没有问题了~优化问题是在能正常运行的情况下再考虑的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-27 22:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 8楼 啊蒋
对哦~刚刚上楼回答感觉没有好好理解提问~对上楼进行补充~这样定义是一个在while内的局部变量~在复合语句用到变量再进行申明是一个编程习惯~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-02-27 22:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-474578-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.578425 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved