• C++ 函数中返回字符串的一个陷阱


     1 #include<iostream>
     2 using namespace std;
     3 char * getname(void);
     4 int main()
     5 {
     6     char * name;
     7     name = getname();
     8     cout << "My name is : " << name << endl;
     9     cout << "---------华丽的分割线----------" << endl;
    10     return 0;
    11 }
    12 char * getname()
    13 {
    14     char get_name[30];
    15     cout << "Enter your name :";// a word
    16     cin >> get_name;
    17     return get_name;
    18 }

    可能第一眼看上去没什么毛病,BUT  getname()里面的get_name是一个字符串数组。在函数return之后这个get_name会释放内存(因为她在栈中,函数执行玩会弹栈)。所以main函数中的name变成了一个野指针,这是一个很危险的操作。

    解决办法:返回一个在堆中的地址。

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 char * getname(void);
     5 int main()
     6 {
     7     char * name;
     8     name = getname();
     9     cout << "My name is : " << name << endl;
    10     cout << "---------华丽的分割线----------" << endl;
    11     return 0;
    12 }
    13 char * getname()
    14 {
    15     char get_name[30];
    16     cout << "Enter your name :";// a word
    17     cin >> get_name;
    18     char * name = new char[strlen(get_name)+1];
    19     strcpy(name, get_name);// do not use name = get_name
    20     //because name will get get_name address it's in the stack
    21     //it is stupid idea.
    22     return name;
    23 }

    考虑到内存的问题记得要在new之后不用了要delete,释放内存资源。

    delete [] name;

    没学过C语言,照着文档用malloc-free版本的。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdlib>
     4 using namespace std;
     5 char * getname(void);
     6 int main()
     7 {
     8     char * name;
     9     name = getname();
    10     cout << "My name is : " << name << endl;
    11 //    delete [] name;
    12     free(name);
    13     cout << "---------华丽的分割线----------" << endl;
    14     return 0;
    15 }
    16 
    17 char * getname()
    18 {
    19     char get_name[30];
    20     cout << "Enter your name :";// read a word
    21     cin >> get_name;
    22     char * name = (char*)malloc(strlen(get_name)+1);
    23     strcpy(name, get_name);
    24     return name;
    25 }

     附上文档:

    free了不代表这个指针不能用了,只是释放了内存地址。 


    附加上一个坑:

    char * a = "Hello World";

    a[0] = 'M';

    这个是不可以的,因为"Hello World"是字符串常量,修改常量是不允许的,应该把这段写成

    const char * a = "Hello World";

    这样更好的引起注意。

  • 相关阅读:
    搜索引擎elasticsearch监控利器cat命令
    zuul中的prefix 和 strip-prefix
    微服务:Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors 异常
    JVM-GC算法和收集器
    JVM-内存结构
    redis专题之缓存存在的几大问题(穿透、击穿、雪崩)
    redis专题之redis cluster高可用集群
    redis专题之集群
    redis专题之持久机制
    redis专题之基础篇
  • 原文地址:https://www.cnblogs.com/zuosy/p/8051419.html
Copyright © 2020-2023  润新知