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

來源:互聯網
上載者:User

標籤:names   com   ret   str   using   .com   ring   logs   陷阱   

 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 word16     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 word17     cin >> get_name;18     char * name = new char[strlen(get_name)+1];19     strcpy(name, get_name);// do not use name = get_name20     //because name will get get_name address it‘s in the stack21     //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 word21     cin >> get_name;22     char * name = (char*)malloc(strlen(get_name)+1);23     strcpy(name, get_name);24     return name;25 }

 附上文檔:

free了不代表這個指標不能用了,只是釋放了記憶體位址。 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.