CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

指针与返回字符串函数的一个疑惑!!!

楼主luojinzhong2002(Big boy)2006-11-15 15:52:37 在 C/C++ / C语言 提问

下面的函数是要返回一个字符串!!  
    请问三种写法是否都正确??  
  (1)char   *CheckName(char   *mess)  
  {  
      char   *temp;  
      temp=malloc(sizeof(mess)*2);  
      strcpy(temp,mess);  
      strcat(temp,".exe");  
      return   temp;  
  }  
   
  (2)char   *CheckName(char   *mess)  
  {  
      char   temp[20];  
     
      strcpy(temp,mess);  
      strcat(temp,".exe");  
      return   temp;  
  } 问题点数:2、回复次数:43Top

1 楼creamymami(尤文图斯)回复于 2006-11-15 15:55:48 得分 0

2好象不对,temp数组是局部的,函数结束就释放了,返回的指针是未知空间Top

2 楼boot2006()回复于 2006-11-15 16:08:27 得分 0

sizeof(mess)这样求出来的是指针大小4,若按照楼主的意思,那么,函数应该这样  
  char   *CheckName(char   *mess,   int   len),跟上mess的长度,这样才行Top

3 楼lujun5100(笑笑)回复于 2006-11-15 16:19:24 得分 0

所以说1是不对地  
  2还不是很清楚。。。我觉得可行,要实验下才知道  
   
  指针是万恶之源!!Top

4 楼alan001(星岛孤裔林郎君)回复于 2006-11-15 16:19:34 得分 0

不标准,记住用free()释放空间......Top

5 楼alan001(星岛孤裔林郎君)回复于 2006-11-15 16:21:11 得分 0

2个例子不对,堆栈上的指针内容是不保证的.....................Top

6 楼mmqmjy(莫名其妙)回复于 2006-11-15 16:27:01 得分 0

2明显是错的  
  1中malloc的参数也有问题,应该是malloc(strlen(mess)+strlen(".exe")+1);  
   
  指针不是万恶之源,是最灵活最好用的东西Top

7 楼lujun5100(笑笑)回复于 2006-11-15 16:28:30 得分 0

乱七八糟,看不下去了快Top

8 楼left_zxp(专逃课的左手)回复于 2006-11-15 16:48:21 得分 0

mmqmjy正解,指针是C最强大的东东Top

9 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-15 17:08:41 得分 0

1,dui,   dont   forget   to   free   the   pointer  
  2,cuo,   the   space   allocated     via     stack   ,after   the   function   exit,the   stack   will   free   it  
  Top

10 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:20:06 得分 0

da   jia   hui   yi   xia   !!Top

11 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:28:35 得分 0

(1)是需要释放指针,但分配空间sizeof()不对吗!strlen()返回的是字节数吗?  
  (2)*mess可以看成是mess[];而且是函数参数,怎抹灰错呢?Top

12 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:28:59 得分 0

清高手赐教Top

13 楼boot2006()回复于 2006-11-15 17:35:27 得分 0

(1)分配空间用sizeof没错,但是你对char   *mess用sizeof,算出来的是这个指针的大小,也就是4  
  而不是你想要的这个串的大小  
  (2)你的char   temp[20]是在栈上分配的,在函数返回的时候就无效了Top

14 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:38:21 得分 0

char   temp[20]是不是应该作为参数传进来?Top

15 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:41:22 得分 0

栈的空间分配是在函数值返回之前,就结束释放空间吗?Top

16 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:41:55 得分 0

请赐教!!Top

17 楼boot2006()回复于 2006-11-15 17:45:13 得分 0

temp   作为参数传递也可以,也就是所谓的值-结果行  
  void   CheckName(char   *mess,   char   *temp)  
  {  
   
  strcpy(temp,mess);  
  strcat(temp,".exe");  
  }  
  这样你的保证temp有合法且足够的空间  
   
  Top

18 楼todototry(来csdn,学会扯淡了...)回复于 2006-11-15 17:51:35 得分 0

1想法对,但malloc尺寸计算不对,  
  (1)char   *CheckName(char   *mess)  
  {  
  char   *temp;  
  temp=malloc(sizeof(mess)*2);  
  strcpy(temp,mess);  
  strcat(temp,".exe");  
  return   temp;  
  }  
  mess是指针的话,得sizeof(mess)不正确  
  所以数组名的话得到原数组的长度  
  按目的的看  
  temp   =   malloc(sizeof(mess/*数组名*/)   +   4   +   1);  
  末字符的赋值0Top

19 楼todototry(来csdn,学会扯淡了...)回复于 2006-11-15 17:52:46 得分 0

不对的,返回局部变量的指针,栈释放,指针指向了个未知地方  
  (2)char   *CheckName(char   *mess)  
  {  
  char   temp[20];  
   
  strcpy(temp,mess);  
  strcat(temp,".exe");  
  return   temp;  
  }Top

20 楼todototry(来csdn,学会扯淡了...)回复于 2006-11-15 17:53:06 得分 0

个人意见,高手多多指教Top

21 楼jackeylb()回复于 2006-11-15 18:24:28 得分 0

两个都不对!!  
  第一个要进行强制转换,如下:  
  char   *CheckName(char   *mess)  
  {  
      char   *temp;  
       
      temp=(char*)malloc(sizeof(mess)*2);  
   
      strcpy(temp,mess);  
      strcat(temp,".exe");  
       
      return   temp;  
  }  
  第二个,当返回时,系统会自动回收资源,所以将不会有值返回出来Top

22 楼realfei83(会飞的人)回复于 2006-11-15 19:18:15 得分 0

两个都   不对。  
   
  (1)char   *CheckName(char   *mess)  
  {  
      char   *temp;  
   
      temp=malloc(sizeof(mess)*2);    
      strcpy(temp,mess);  
      strcat(temp,".exe");  
      return   temp;  
  }  
   
  (2)char   *CheckName(char   *mess)  
  {  
      char   temp[20];  
     
      strcpy(temp,mess);  
      strcat(temp,".exe");  
      return   temp;  
  }  
  Top

23 楼realfei83(会飞的人)回复于 2006-11-15 19:41:11 得分 0

(1)char   *CheckName(char   *mess)  
  {  
      char   *temp;  
      /*    
          sizeof(mess)   返回的是指向字符串指针的大小,在32位操作系统中指针变量占用4个字节的内存,不管是   int*,还是char*   用一个样,占4字节内存。  
      */  
      temp=malloc(sizeof(mess)*2);   //所以这是是错的,   最后记得用完   temp   要free  
      strcpy(temp,mess);  
      strcat(temp,".exe");  
      return   temp;  
  }  
   
  (2)char   *CheckName(char   *mess)  
  {  
  //   char   temp[20]   是在栈里分配了   20   *   sizeof(char)   个字节,在C语言里   char   =   8bits,所以是一个字节,20   *   sizeof(char)   也就是分配了20个字节。  
  //   堆和栈是不同的,在栈里分配的内存在函数退出后会自动释放所占的内存,堆内存分配是由程序员自己控制的,如:char   *name   =   (char   *)malloc(20   *   sizeof(char));   strcpy(name,   "NorthWind");   free(name);   //   要记得,堆内存分配后,用完后要释放。  
   
      char   temp[20];    
     
      strcpy(temp,mess);  
      strcat(temp,".exe");  
      return   temp;   //   因为temp   在函数退出后自动被释放,所以返回的temp是个空悬指针。  
  }Top

24 楼qxbnit(蓝灵)回复于 2006-11-15 22:37:36 得分 0

 
  free?!  
   
  !!!!  
   
  ????Top

25 楼qxbnit(蓝灵)回复于 2006-11-15 22:38:12 得分 0

return?!  
   
  !!!!  
   
  ????Top

26 楼Nowish(看我能忍耐多久)回复于 2006-11-16 08:51:13 得分 0

mark~Top

27 楼xkb_surfing()回复于 2006-11-16 09:25:45 得分 0

两个没有一个对的Top

28 楼haroldi()回复于 2006-11-16 09:57:08 得分 0

请问这里怎么free   掉temp????  
  free   后还怎么返回?Top

29 楼aa3000(杀手K)回复于 2006-11-16 10:36:12 得分 0

用完   temp   之后再   free  
   
  char   *CheckName(char   *mess)  
  {  
      char   *temp;  
      temp   =   malloc(strlen(mess)   +   strlen(".exe")   +   1);  
      strcpy(temp,mess);  
      strcat(temp,".exe");  
      return   temp;  
  }  
   
  char   a[]   =   "abcd";  
  char   *   p=   CheckName(a);  
  //   do   something   here   width   p   ,   but   not   resize   the   p   buffer  
  free(p);  
  Top

30 楼lzq123335(你答题来我给分)回复于 2006-11-16 11:02:31 得分 0

2好象不对,temp数组是局部的,函数结束就释放了,返回的指针是未知空间  
  #################################  
    char   *temp;   temp也是局部变量,  
   
      char   temp[20]也是局部变量。为什么前者函数结束,返回指针不是未知空间?  
  如果两个都要用的话,怎么要在这个函数内要free呢?  
  Top

31 楼lingdianhuoyan()回复于 2006-11-16 11:12:45 得分 0

ls的基本正确!不过在temp=(char*)malloc(strlen(mess)+strlen(".exe")+1);要强制转换!Top

32 楼haroldi()回复于 2006-11-16 16:45:11 得分 0

aa3000(杀手K)   (   )    
  用完   temp   之后再   free  
  char   *CheckName(char   *mess)  
  {  
      char   *temp;  
      temp   =   malloc(strlen(mess)   +   strlen(".exe")   +   1);  
      strcpy(temp,mess);  
      strcat(temp,".exe");  
      return   temp;  
  }  
  char   a[]   =   "abcd";  
  char   *   p=   CheckName(a);  
  //   do   something   here   width   p   ,   but   not   resize   the   p   buffer  
  free(p);  
   
  又建一指针p指向返回的指针,那...指针p的释放与返回的指针   有什么关系??  
  返回的指针   并没有被释放啊.  
   
   
  谁能帮帮教教我啊,谢谢!  
     
  Top

33 楼neustrong(小强)回复于 2006-11-16 16:52:16 得分 0

都不对,,Top

34 楼sevenzeal(I`m Pointer .Pointer is heart.So S=NULL)回复于 2006-11-16 23:34:42 得分 0

指针是万恶之源!!  
  ??????????????  
  不管指针是什么   偶的最爱Top

35 楼dyts0000()回复于 2006-11-19 10:44:45 得分 0

temp=malloc(sizeof(mess)*2)应该写成temp=(char   *)malloc(sizeof(mess)*2),其次sizeof(mess)是求取分配给指针变量的字节数,但是第一种写法可以正常运行,即使写成temp=(char   *)malloc(1);这个就有点不明白了。  
  第二种写法看上去没什么问题,但是运行时就有问题了。如果mess所指向的字符串长度小于20,假定是"hello",运行结果是只输出"he",后面是一堆乱码,可如果将temp[20]改成temp[30],结果就正确了。照理说temp[20]已经足够大了,可为什么会出现这种情况呢?  
  期待高人的回答.....  
  Top

36 楼myskyx()回复于 2006-11-19 11:27:10 得分 0

局部分配的空间,在函数一运行就识放了Top

37 楼myskyx()回复于 2006-11-19 11:28:16 得分 0

char   *CheckName(char   *mess)  
  {  
      char   *temp;  
      temp=malloc(sizeof(mess)*2);  
      strcpy(temp,mess);  
      strcat(temp,".exe");  
      return   temp;  
  }  
   
  (2)char   *CheckName(char   *mess)  
  {  
      char   temp[20];  
     
      strcpy(temp,mess);  
      strcat(temp,".exe");  
      return   temp;  
  }  
   
  局部变量在外局是不能访问的Top

38 楼shanzhongyufu(山中渔夫)回复于 2006-11-19 11:28:47 得分 0

两种都不好,  
  (1)中temp=malloc(sizeof(mess)*2);   -->   temp=malloc(strlen(mess)*2);  
    调用后记得释放temp    
   
  (2)中temp[20]局部数组,函数结束内存释放,虽然有可能可以继续使用,但是结果为定义,不是标准的写法。  
  Top

39 楼shanzhongyufu(山中渔夫)回复于 2006-11-19 11:33:08 得分 0

 
  没细看,应该是  
  (1)中temp=malloc(sizeof(mess)*2);   -->   temp=malloc(strlen(mess)+strlen(".exe")+1);  
  Top

40 楼shanzhongyufu(山中渔夫)回复于 2006-11-19 11:34:55 得分 0

图省事还可以将temp=malloc(strlen(mess)+strlen(".exe")+1);     -->  
   
  temp=malloc(strlen(mess)+5);     呵呵Top

41 楼liusujian02(刘阿建)回复于 2006-11-19 15:18:05 得分 0

其他的不说    
   
  自己亲自试验一下就知道其中的原因  
   
  你可以尝试着不要先去问别人    
   
  自己先想想问题的解决办法  
   
  给你推荐一本书    
   
  《提问的智慧》Top

42 楼realfei83(会飞的人)回复于 2006-11-19 16:35:31 得分 0

第二种写法看上去没什么问题,但是运行时就有问题了。如果mess所指向的字符串长度小于20,假定是"hello",运行结果是只输出"he",后面是一堆乱码,可如果将temp[20]改成temp[30],结果就正确了。照理说temp[20]已经足够大了,可为什么会出现这种情况呢?  
  =================================================================================  
  出现上面这种情况是你还没了解C语言的内存分配机制。  
  要先分清"堆",   "栈"的内存分配是不同的。  
   
  注意C/C++里的关键字“auto”,auto意思是定义自动变量。  
  auto   只能在函数中使用,表是当函数退出时释放变量所占的内存。  
  例如:    
  void   f()  
  {  
            auto   int   i   =   10;   //   等于   auto   int   i   =   10;  
  }  
   
  //////////////////////  
  void   func(char   *name)  
  {  
          char   temp[20];   //   这里是在栈中分配20个字符。  
          strcpy(temp,   name);  
          printf("%s\n",   temp);  
     
          //   这里temp就被释放了  
          //   here~~~~~~~~~~~~~~~~!  
          return;   //   在函数返回前,temp被自动释放(temp被释放掉的内存,可以被程序重新使用)  
        //   所以出现下面这种情况  
  /*          
  如果mess所指向的字符串长度小于20,假定是"hello",运行结果是只输出"he",后面是一堆乱码,可如果将temp[20]改成temp[30],结果就正确了。照理说temp[20]已经足够大了,可为什么会出现这种情况呢?  
   
  temp   在return   temp   前就被释放了,就所改成   char   temp[10000]也是错的,    
  反汇编一下就什么都清楚了  
  */  
  }  
   
  int   main()  
  {  
          auto   int   i;     //   int   i   等于   auto   int   i,只是通常写变量定义时auto一般不写。  
          i   =   10;  
          func("realfei83");  
          return   0;  
  }  
  Top

43 楼realfei83(会飞的人)回复于 2006-11-19 16:36:42 得分 0

为了这2分我容易吗!我~  
  这么还不给分Top

相关问题

关键词

得分解答快速导航

  • 帖主:luojinzhong2002

相关链接

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

广告也精彩

反馈

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