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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++函数中返回字符串的⼀个陷阱
1 #include<iostream>
2using namespace std;
3char * getname(void);
4int main()
5 {
6char * name;
7 name = getname();
8 cout << "My name is : " << name << endl;
9 cout << "---------华丽的分割线----------" << endl;
10return0;
11 }
12char * getname()
13 {
14char get_name[30];
15 cout << "Enter your name :";// a word
16 cin >> get_name;
17return get_name;
18 }
可能第⼀眼看上去没什么⽑病,BUT getname()⾥⾯的get_name是⼀个字符串数组。

在函数return之后这个get_name会释放内存(因为她在栈中,函数执⾏玩会弹栈)。

所以main函数中的name变成了⼀个野指针,这是⼀个很危险的操作。

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

1 #include<iostream>
2 #include<cstring>
3using namespace std;
4char * getname(void);
5int main()
6 {
7char * name;
8 name = getname();
9 cout << "My name is : " << name << endl;
10 cout << "---------华丽的分割线----------" << endl;
11return0;
12 }
13char * getname()
14 {
15char get_name[30];
16 cout << "Enter your name :";// a word
17 cin >> get_name;
18char * 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.
22return name;
23 }
考虑到内存的问题记得要在new之后不⽤了要delete,释放内存资源。

delete [] name;
没学过C语⾔,照着⽂档⽤malloc-free版本的。

1 #include<iostream>
2 #include<cstring>
3 #include<cstdlib>
4using namespace std;
5char * getname(void);
6int main()
7 {
8char * name;
9 name = getname();
10 cout << "My name is : " << name << endl;
11// delete [] name;
12free(name);
13 cout << "---------华丽的分割线----------" << endl; 14return0;
15 }
16
17char * getname()
18 {
19char get_name[30];
20 cout << "Enter your name :";// read a word
21 cin >> get_name;
22char * name = (char*)malloc(strlen(get_name)+1);
23 strcpy(name, get_name);
24return name;
25 }
附上⽂档:
free了不代表这个指针不能⽤了,只是释放了内存地址。

附加上⼀个坑:
char * a = "Hello World";
a[0] = 'M';
这个是不可以的,因为"Hello World"是字符串常量,修改常量是不允许的,应该把这段写成const char * a = "Hello World";
这样更好的引起注意。

相关文档
最新文档