我們可能會經常寫出這樣的代碼:
int add(int a , int b)
{
return a + b;
}
當然,這是合理的寫法,使函數的返回值為 int ,所以,調用函數後會返回一個int型的值。
今天,我想討論的問題當然不是這個,請看下面這段代碼:
char* Func_1(void)
{
char str[30] = "Bruce";
cout<<"str:"<<str<<endl;
return str; //???????
}
這裡有問題嗎?不是和上面一樣嗎?
當然不一樣,上面的函數返回的是一個具體值,但是這個函數但會的是一個地址,那麼,函數不可以返回地址嗎?當然可以,只是,這裡不行。
這裡的地址是一個局部變量 str 的地址,我們都知道,局部變量是存儲在棧裡的,當函數執行時,其中的局部變量會執行壓棧操作,但是,當函數執行完畢後,棧中的數據會彈出,以便騰出棧空間。
所以,當函數執行完畢後,指針指向的地址當然是存在的,只是它指向的數據已經不在了。
真的是這樣嗎?
下面給出一個例子:
#include <iostream> #include <string> using namespace std; const char* testValue = "BruceZhang"; char gstr[30] = {0}; char* Func_1(void); char* Func_2(void); int main(void) { char* func_1; char* func_2; func_1 = Func_1(); func_2 = Func_2(); cout<<"func_1:"<<func_1<<endl; cout<<"func_2:"<<func_2<<endl; system("pause"); return 0; } char* Func_1(void) { char str[30] = "Bruce"; cout<<"str:"<<str<<endl; return str; } char* Func_2(void) { strcpy(gstr, testValue); cout<<"gstr:"<<gstr<<endl; return gstr; } #include <iostream> #include <string> using namespace std; const char* testValue = "BruceZhang"; char gstr[30] = {0}; char* Func_1(void); char* Func_2(void); int main(void) { char* func_1; char* func_2; func_1 = Func_1(); func_2 = Func_2(); cout<<"func_1:"<<func_1<<endl; cout<<"func_2:"<<func_2<<endl; system("pause"); return 0; } char* Func_1(void) { char str[30] = "Bruce"; cout<<"str:"<<str<<endl; return str; } char* Func_2(void) { strcpy(gstr, testValue); cout<<"gstr:"<<gstr<<endl; return gstr; }
下面的截圖是在我的電腦上運行的結果:
由此可以看出,應該顯示“Bruce”的地方,顯示的是不能識別的亂碼,由此,驗證了上面的說法。
所以,我們在編寫程序的時候需要注意,返回值如果是值,可以大膽的操作,但是,如如果返回的是地址,那麼我們就需要考慮是不是局部自動變量的問題了。