免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2045 | 回复: 4
打印 上一主题 下一主题

[C] 是realloc 引起的问题么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-27 18:25 |只看该作者 |倒序浏览
10可用积分

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define MAXLINE 10

  4. int getline(char *);
  5. void copy(char *, char *);
  6. char *line;
  7. char *longest;

  8. int main(void)
  9. {
  10.         int len;
  11.         int max;  
  12.         line = (char *)malloc(MAXLINE);
  13.         longest = (char *)malloc(MAXLINE);
  14.        
  15.         if(!line && !longest)
  16.                 perror("main malloc ");
  17.                
  18.         max = 0;
  19.        
  20.         while ((len = getline(line)) > 0)
  21.                 if (len > max) {
  22.                         max = len;
  23.                         copy(longest, line);
  24.                 }
  25.                
  26.         if (max > 0)
  27.                 printf("%s\n", longest);
  28.                
  29.         free(line);
  30.         free(longest);
  31.                
  32.         return 0;
  33. }

  34. int getline(char *line)
  35. {
  36.         int c, i;
  37.        
  38.         for (i=0;(c=getchar())!= EOF && c != '\n'; ++i){
  39.                 if(i > MAXLINE - 1)
  40.                         line = (char *)realloc(line,MAXLINE + sizeof(char));

  41.                 if(!line){
  42.                         perror("getline realloc ");
  43.                         return 0;
  44.                 }
  45.                 *(line + i) = c;
  46.         }
  47.        
  48.         if(i > MAXLINE - 1)
  49.                 line = (char *)realloc(line,MAXLINE + sizeof(char));
  50.        
  51.         if(!line){
  52.                         perror("getline realloc ");
  53.                         return 0;
  54.                 }
  55.                
  56.         *(line + i) = '\0';
  57.         return i;
  58. }

  59. void copy(char *longest, char *line)
  60. {
  61.         int i;
  62.        
  63.         for(i = 0; *(line + i) != '\0'; i++){
  64.                 if(i > MAXLINE - 1)
  65.                                 longest = (char *)realloc(longest,MAXLINE + sizeof(char));
  66.                                
  67.                 if(!longest){
  68.                         perror("copy realloc ");
  69.                         return ;
  70.                 }
  71.                
  72.                 *(longest + i) = *(line + i);
  73.         }
  74.        
  75.         if(i > MAXLINE - 1)
  76.                 longest = (char *)realloc(longest,MAXLINE + sizeof(char));
  77.        
  78.         if(!longest){
  79.                         perror("copy realloc ");
  80.                         return ;
  81.                 }
  82.                
  83.         *(longest + i) = '\0';
  84. }

复制代码

老问题,新提法...  
说说我的问题吧,在输入字符串大于 10 时就会 core dumped 掉。经过我反复查证是由于copy函数中的 for(i = 0; *(line + i) != '\0'; i++) 在*(line + i) =='\0'时没有跳出循环,无限的在循环下去,直到超过系统规定最大值限制时就 core dumped 掉。
很郁闷到底是怎么引起的,难道是realloc引起的?

最佳答案

查看完整内容

看下面:MAXLINE 是个常量,MAXLINE+sizeof(char) 就是 11[ 本帖最后由 win_hate 于 2007-11-27 18:48 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-11-27 18:25 |只看该作者

  1. int getline(char *line)
  2. {
  3.         int c, i;
  4.       
  5.         for (i=0;(c=getchar())!= EOF && c != '\n'; ++i){
  6.                 if(i > MAXLINE - 1)
  7.                         line = (char *)realloc(line,MAXLINE + sizeof(char));

  8.                 if(!line){
  9.                         perror("getline realloc ");
  10.                         return 0;
  11.                 }
  12.                 *(line + i) = c;
  13.         }
  14.       
  15.         if(i > MAXLINE - 1)
  16.                 line = (char *)realloc(line,MAXLINE + sizeof(char));
  17.       
  18.         if(!line){
  19.                         perror("getline realloc ");
  20.                         return 0;
  21.                 }
  22.                
  23.         *(line + i) = '\0';
  24.         return i;
  25. }
复制代码


看下面:


MAXLINE 是个常量,MAXLINE+sizeof(char) 就是 11
if(i > MAXLINE - 1)
                line = (char *)realloc(line,MAXLINE + sizeof(char));   // MAXLINE 是常量,realloc 没有真正分配新的空间

*(line + i) = c;          // i 比较大时越界

*(line + i) = '\0';      // i 比较大时越界

[ 本帖最后由 win_hate 于 2007-11-27 18:48 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-11-28 10:04 |只看该作者

  1. char * get_line()
  2. {
  3.         char *str;
  4.         int ch;
  5.         unsigned int bufsize;
  6.         unsigned int i;
  7. #define BUFFER_INCREMENT (4*1024)

  8.         bufsize = BUFFER_INCREMENT;
  9.         str = malloc(bufsize);
  10.         if (NULL == str) {
  11.                 goto exitinput;
  12.         }

  13.         _putch(':');
  14.         i = 0;
  15. getnextchar:
  16.         while (i < bufsize) {
  17.                 ch = _getch();

  18.                 if (EOF == ch
  19.                 || 0x04 == ch
  20.                 || '\r' == ch) {
  21.                         /* End input if encounter
  22.                          * 1.End Of File
  23.                          * 2.CTRL+D
  24.                          * 3.Carrier Return
  25.                          */
  26.                         _putch('\n');
  27.                         str[i] = '\0';
  28.                         goto exitinput;
  29.                 } else if ('\b' == ch) {
  30.                         if (i>0) {
  31.                                 _putch('\b');
  32.                                 _putch(' ');
  33.                                 _putch('\b');
  34.                                 i--;
  35.                         }
  36.                         continue;
  37.                 }
  38.                 _putch(ch);
  39.                 str[i++] = ch;
  40.         }

  41.         bufsize += BUFFER_INCREMENT;
  42.         str = realloc(str, bufsize);
  43.         if (NULL != str) {
  44.                 goto getnextchar;
  45.         }
  46. exitinput:
  47.         return str;
  48. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2007-11-28 10:53 |只看该作者

回复 #2 win_hate 的帖子

谢谢老大,我明白了

论坛徽章:
0
5 [报告]
发表于 2007-11-28 11:12 |只看该作者

回复 #3 sanbiangongzi 的帖子

谢谢你!非常感谢!

[ 本帖最后由 shiner 于 2007-11-28 11:18 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP