C++ 函數中返回字符串的一個陷阱
阿新 • • 發佈:2017-12-17
del ack c語言 str 技術 c++ ges 字符串 pid
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了不代表這個指針不能用了,只是釋放了內存地址。
C++ 函數中返回字符串的一個陷阱