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變成了一個野指針,這是一個很危險的操做。ios
解決辦法:返回一個在堆中的地址。數組
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,釋放內存資源。ide
delete [] name;函數
沒學過C語言,照着文檔用malloc-free版本的。idea
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 }
附上文檔:spa
free了不表明這個指針不能用了,只是釋放了內存地址。 指針
附加上一個坑:code
char * a = "Hello World";blog
a[0] = 'M';內存
這個是不能夠的,由於"Hello World"是字符串常量,修改常量是不容許的,應該把這段寫成
const char * a = "Hello World";
這樣更好的引發注意。