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