1. 程式人生 > >C++ 函數中返回字符串的一個陷阱

C++ 函數中返回字符串的一個陷阱

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++ 函數中返回字符串的一個陷阱