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";

這樣更好的引起注意。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM