z372183629
SandaysComing
采纳率60%
2015-02-06 04:51 浏览 3.1k

关于C++函数返回字符串char*的问题

比如

 char* fun()
 {
     char s1[10];
     char *s2=new char[10];
     //return s1;                报错,不能返回局部变量
     return s2;
 }
 int main(int argc,char** argv)
 {
     char* s=fun();
     delete[] s;                      //是否有必要??如果是返回const char*呢??
 }

因为涉及到内存管理,实在太烦了

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

7条回答 默认 最新

  • huangshanchun huangshanchun 2015-02-06 07:11

    //报错,不能返回局部变量 说明你的编译器比较智能或者版本叫新。在编译阶段就已经检查出了错误。
    char s1[10]; 在函数内部定义局部变量从内存四区的角度来讲,其属于栈区。当你调用这个函数时候, 操作系统为char s1[10]; 在栈区分配空间,
    然而函数调用结束后,操作系统会收回栈区。return s1,是一个已经被释放了空间内存地址。一般在编译没有报错,则执行的时候肯定会出错。
    char *s2=new char[10]; 是你自己动态申请的内存,其是在堆区。函数调用完后,操作系统不会主动释放其空间。所以可以返回其首地址。正因为
    操作系统不主动回收其内存,因此需要你主动释放。要想写好这样一类程序,一定要理解内存四区概念。

    点赞 2 评论 复制链接分享
  • 91program 91program 2015-02-06 04:58

    S1 是静态的地址,不是局部变量的原因。s2 也是局部变量!
    一般不做做函数内分配,外面释放的设计。但就你的代码,是必须要释放的。

    点赞 1 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2015-02-06 04:58

    当然有必要,否则会造成内存泄漏。
    一般来说主程序分配和回收,而子程序不管。
    这样配对写不容易出错。

    点赞 1 评论 复制链接分享
  • oyljerry oyljerry 2015-02-06 06:21

    需要释放,否则就内存泄露了。
    所以这种设计就不是很好。c++中讲究RAII
    你需要定义分配,释放对应的一组接口。所以你的例子就要再定义一个释放函数给main调用。

    点赞 评论 复制链接分享
  • Real_Myth 凌风探梅 2015-02-06 06:48

    只要是你的代码分配的就应该有你的代码释放。不同类型的指针只是限制了的你的操作行为。

    点赞 评论 复制链接分享
  • sz76211822 qq76211822 2015-02-07 09:11

    当然有必要,否则会造成内存泄漏。

    点赞 评论 复制链接分享
  • wangkui1331 kevin--你不知道的事 2015-03-18 11:15

    函数不能返回局部变量的地址,因为局部变量返回意味着其生命周期结束,再去释放又有何意义呢

    点赞 评论 复制链接分享

相关推荐