CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

大家看看这个程序那里错了?华为的,很奇怪啊

楼主yangw150(永远超越)2006-03-16 15:34:10 在 C/C++ / C语言 提问

函数的功能是输出用户输入的字符串  
  #include   "stdio.h"    
  #include   "string.h"    
  #include   "malloc.h"    
  #define   OK   0    
  #define     ERR   1    
  #define     ERROR     (-1)    
  #define     BUFFER_SIZE     256    
  int   Getme(char**pps,int   num)    
  {    
        if(NULL==pps)    
        {     assert(0);  
              return   ERROR;    
              }    
              *pps=(char   *)malloc(num);    
              if(NULL==*pps)    
        {    
              return   ERROR;    
              }    
          memcpy(*pps,"hred%stail",11)  
              return   OK;    
  }    
               
  void   main()    
  {    
      char   *psb=NULL;    
     
    if(OK==Getme(&psb,BUFFER_SIZE))  
    {      
          printf(psb);    
          free(psb);    
          psb=NULL;    
          }    
          return;    
  }    
  问题点数:10、回复次数:9Top

1 楼treeroot(旗鲁特)回复于 2006-03-16 15:48:57 得分 0

if(NULL==*pps)    
        {    
              return   ERROR;    
              }    
   
  *pps指针指向的值,  
  改为  
  if(NULL==pps)    
        {    
              return   ERROR;    
              }    
  Top

2 楼treeroot(旗鲁特)回复于 2006-03-16 15:49:34 得分 0

下面的也都是这个错误Top

3 楼jinjiajie(leorio)回复于 2006-03-16 15:50:11 得分 0

错误信息弄出来,我这里编译出来都是因为你的程序是从网页上还是什么地方拷来导致的错误Top

4 楼angelanpan()回复于 2006-03-16 15:51:59 得分 0

%好像有问题吧  
  "hred%%stail"Top

5 楼wgjmail(笑面佛)回复于 2006-03-16 16:05:44 得分 0

malloc分配的数据应该马上初始化为0,   这里并没有,   这只算是个警告,   不能算直接的错误.  
  由于这样不初始化的为0,   复制的字符串   hred%stail   又没有结束符\0,   所以当Getme()返回成功后,执行   printf(psb)时就会出错.Top

6 楼angelanpan()回复于 2006-03-16 16:07:32 得分 10

就是%的问题  
  在printf看来pps是"hred%stail"   那么%s会被看作是一个字符串的输出格式,那么printf会读取第二个参数,而第二个参数恰好为NULL,导致读取NULL的指针,段错误.  
  改为:  
  int   Getme(char**pps,int   num)    
  {    
        if(NULL==pps)    
        {     assert(0);  
              return   ERROR;    
              }    
              *pps=(char   *)malloc(num);    
              if(NULL==*pps)    
        {    
              return   ERROR;    
              }    
          memcpy(*pps,"hred%%stail",11)  
              return   OK;    
  }    
   
  就不会有错误了  
  Top

7 楼angelanpan()回复于 2006-03-16 16:10:39 得分 0

memcpy((*pps,"hred%stail",11)     复制了'\0',因为常量字符串都回默认在后面加上'\0',也就是说在内存里面是这样的"hred%stail\0";  
   
  哦,   上楼的程序最好改为:memcpy(*pps,"hred%%stail",12)  
  Top

8 楼hyallentong(Caniggia)回复于 2006-03-16 16:15:24 得分 0

memcpy(**pps,"hred%stail",11)  
                ^^Top

9 楼hyallentong(Caniggia)回复于 2006-03-16 16:20:45 得分 0

晕打了两个*号Top

相关问题

  • 奇怪的程序错误
  • 奇怪的程序
  • 关于华为的Delphi程序员
  • 一个极奇怪的SHELL调用程序出错的问题
  • 很是奇怪!编译程序老是错误!高手请进!
  • 简单的OpenGL程序出现奇怪的编译错误
  • 这个程序怎么会出现奇怪的错误呢?
  • 一个奇怪的错误.程序经常停在这里
  • 这个程序很奇怪??!!
  • 我写的程序为什么在98下面报奇怪错误

关键词

  • null
  • stail
  • hred
  • pps
  • psb
  • 字符串
  • getme
  • 程序
  • 错误
  • memcpy

得分解答快速导航

  • 帖主:yangw150
  • angelanpan

相关链接

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

广告也精彩

反馈

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