CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

【100】 一小时内结帖

楼主heuristic(懵懂书童||十年面壁图破壁)2005-03-13 18:46:44 在 C/C++ / C语言 提问

单步调一点儿问题都没有,一执行就说段溢出    
   
  还想问问,如果我在函数内给char   **p   malloc空间,然后往里面写数据  
  然后return   p,那么p指向的内容是不是已经作为局部变量而被释放掉了呢?  
   
   
  #include   <stdio.h>    
  #include   <string.h>    
  #include   <stdlib.h>    
  #include   <ctype.h>    
   
  #define   OPT_STRTOK_DIVIDEALL         0         /*   divide   the   input   string   in   details            
            */    
  #define   OPT_STRTOK_DEFAULT         1         /*   divide   the   input   string   into   ONLY   two   pa    
  rt   */    
  #define   SUB_STRING_LENTH         20         /*   each   sub-string   lenth                             */    
  int   iar_strtok_len   ;    
   
  int   iar_strtok(char   *   src,char   *flag,int   option,char   *des[]){    
        int   i,   j,len;    
        char   *p,*q;    
         
        i   =   j   =   0;    
        /*    
        *       Format   input   string    
        */    
        len   =   strlen(src)   -1;    
        while(isspace(src[len])){    
                src[len]   =   '\0';    
                len--;    
                }    
        /*         divide   string         */    
        q   =   strtok(src,flag);    
         
        strncpy(des[j],q,strlen(q));    
        j++;    
        while((p   =   strtok(NULL,flag))   ){    
        strncpy(des[j],p,strlen(p));    
         
                j++;    
                if(   option   !=   OPT_STRTOK_DIVIDEALL)    
                      if(j   >=   option)    
                            break;    
                   
        }    
      return   j;    
  }    
   
  int   main(){    
          char   *   str   =   "aaa   bbb   ccc   ddd   eee   fff";    
             
          char   *part[10];    
          int   i   =   0;    
          int   on   =   OPT_STRTOK_DIVIDEALL;    
          for(   i   =   0;   i   <   10;   i++)    
                part[i]   =   (char   *)malloc(SUB_STRING_LENTH);    
             
         
            iar_strtok_len   =   iar_strtok(str,"   ",on,part);    
          for(i   =   0;i   <   iar_strtok_len;   i++){    
                  fprintf(stdout,"part   %d   :   %s\n",i,part[i]);    
                  }    
                             
                  return   0;    
  }    
  问题点数:100、回复次数:22Top

1 楼nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)回复于 2005-03-13 18:55:23 得分 0

先说说这段代码干啥的?Top

2 楼llmsn("若虚"即"虚怀若谷"!!!)回复于 2005-03-13 18:55:37 得分 0

1楼啊.Top

3 楼llmsn("若虚"即"虚怀若谷"!!!)回复于 2005-03-13 18:56:00 得分 0

555,成2楼了.Top

4 楼Student02370236(★★★★★★)回复于 2005-03-13 19:03:18 得分 0

楼主这是个词法分析的程序吗?Top

5 楼Student02370236(★★★★★★)回复于 2005-03-13 19:04:19 得分 0

函数内部的char*   p是返不回去的,在函数返回的时候就被销毁了Top

6 楼heuristic(懵懂书童||十年面壁图破壁)回复于 2005-03-13 19:04:32 得分 0

功能:  
            同strtok差不太多,就是把字符串分割成子串,每个子串分别存放在part[i]中Top

7 楼pcboyxhy(-273.15℃)回复于 2005-03-13 19:10:59 得分 10

int   *foo(   void   )  
  {  
          int   *p=new   int[100];  
                  写数据;  
      return   p;  
  }  
   
  这个是没有问题的。Top

8 楼Student02370236(★★★★★★)回复于 2005-03-13 19:17:13 得分 0

楼主的程序在单步调试的时候也会出在问题,在q   =   strtok(src,flag);   语句会出现段异常Top

9 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:19:14 得分 50

1.char   *   str   =   "aaa   bbb   ccc   ddd   eee   fff";   是指向常量的指针,你不能改变他,strtok肯定会出错.  
   
  char*     str   =   new   char[24];  
  memcpy(str,"aaa   bbb   ccc   ddd   eee   fff",24);  
  ...  
  delete[]   str;  
  return   0;    
   
  2.strncpy(des[j],q,strlen(q));考完了之后要把最后一位赋值为0,要不输出的结果会有问题  
   
  strncpy(des[j],q,strlen(q));  
  des[j][strlen(q)]   =   '\0';//添加的  
  j++;    
  while((p   =   strtok(NULL,flag))   )  
  {    
  strncpy(des[j],p,strlen(p));    
  des[j][strlen(p)]   =   '\0';//添加的  
   
  j++;    
  if(   option   !=   OPT_STRTOK_DIVIDEALL)    
  if(j   >=   option)    
  break;    
   
  }    
  return   j;    
   
  输出结果:  
  part   0   :   aaa  
  part   1   :   bbb  
  part   2   :   ccc  
  part   3   :   ddd  
  part   4   :   eee  
  part   5   :   fff  
  Press   any   key   to   continue  
  Top

10 楼prgmBaggio(only C)回复于 2005-03-13 19:20:03 得分 0

还想问问,如果我在函数内给char   **p   malloc空间,然后往里面写数据  
  然后return   p,那么p指向的内容是不是已经作为局部变量而被释放掉了呢?  
  -------------------------------------------------------------------------  
  当然,函数调用结束返回已经被KILL掉的内存当然会报错Top

11 楼Student02370236(★★★★★★)回复于 2005-03-13 19:21:50 得分 20

我将楼主的主程序改成:  
  int   main(){    
          √char   *   str;    
             
          char   *part[10];    
          int   i   =   0;    
          int   on   =   OPT_STRTOK_DIVIDEALL;    
           
    √str=(char   *)malloc(50*sizeof(char));  
           
    strcpy(str,"aaa   bbb   ccc   ddd   eee   fff");  
          for(   i   =   0;   i   <   10;   i++)    
                part[i]   =   (char   *)malloc(SUB_STRING_LENTH);    
             
         
            iar_strtok_len   =   iar_strtok(str,"   ",on,part);    
          for(i   =   0;i   <   iar_strtok_len;   i++){    
                  fprintf(stdout,"part   %d   :   %s\n",i,part[i]);    
                  }    
                system("PAUSE");              
                  return   0;    
  }    
  打勾的是我改的  
  改正以后程序就可以正常运行了Top

12 楼Student02370236(★★★★★★)回复于 2005-03-13 19:22:27 得分 0

也就是说应该先为str分配空间,再把字符串存入Top

13 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:23:33 得分 0

to   楼上,malloc所申请的空间在堆上,不会被释放Top

14 楼nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)回复于 2005-03-13 19:23:59 得分 5

还是小疯子比较仔细……  
   
  不过更简单的方法是char     str[]   =   "aaa   bbb   ccc   ddd   eee   fff";   这样就可以了  
   
  另外strncpy不需要置'\0'吧?不过这样不是很安全,MSDN如是说:  
  The   strncpy   function   copies   the   initial   count   characters   of   strSource   to   strDest   and   returns   strDest.   If   count   is   less   than   or   equal   to   the   length   of   strSource,   a   null   character   is   not   appended   automatically   to   the   copied   string.Top

15 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:25:10 得分 0

汗,刷新的好快,应该是   to   prgmBaggioTop

16 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:26:33 得分 5

呵呵,如果不设为.结果是:  
   
  part   0   :   aaa屯屯屯屯屯屯屯屯妄鼳  
  part   1   :   bbb屯屯屯屯屯屯屯屯妄鼳  
  part   2   :   ccc屯屯屯屯屯屯屯屯妄鼳  
  part   3   :   ddd屯屯屯屯屯屯屯屯妄鼳  
  part   4   :   eee屯屯屯屯屯屯屯屯妄鼳  
  part   5   :   fff屯屯屯屯屯屯屯屯妄鼳  
  Press   any   key   to   continue  
  Top

17 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:28:41 得分 5

他des没有初始化,所以要在最后加一个0的,呵呵Top

18 楼nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)回复于 2005-03-13 19:28:51 得分 0

你用的什么工程?我在控制台下面编译没有问题……Top

19 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:30:12 得分 5

如果他一开始就初始化了,就不用了  
   
          for(   i   =   0;   i   <   10;   i++)    
  {  
  part[i]   =   (char   *)malloc(SUB_STRING_LENTH);    
  memset(part[i],0,SUB_STRING_LENTH);  
  }  
  Top

20 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2005-03-13 19:31:01 得分 0

VC(别的我都不会用,惭愧的说^o^   )Top

21 楼heuristic(懵懂书童||十年面壁图破壁)回复于 2005-03-13 19:36:49 得分 0

呵呵     谢谢大家   !  
   
  我用的是gcc,刚才翻手册查strtok呢  
    欢迎继续讨论,结帖了Top

22 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-03-13 19:45:23 得分 0

malloc是堆上分配,不是局部变量Top

相关问题

  • struts问题~~24小时内结帖
  • 散分!(半小时结帖)
  • 24小时结帖哦~
  • 100分~24小时结帖~~
  • 急~~~简单问题,24小时内结帖
  • 求救-这个SQL怎么写,24小时内结帖
  • myec问题哦~~老规矩~24小时内结帖~~
  • 高分求助~~~半小时结帖~~~~
  • struts+hibernate~~24小时结帖哦~~~
  • 20分+3个月qq会员求一基础问题 两小时内结帖

关键词

  • 函数
  • strtok
  • divideall
  • opt
  • divide
  • len
  • strlen
  • malloc
  • src
  • des

得分解答快速导航

  • 帖主:heuristic
  • pcboyxhy
  • EnochShen
  • Student02370236
  • nodummy
  • EnochShen
  • EnochShen
  • EnochShen

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo