閱讀682 返回首頁    go 阿裏雲 go 技術社區[雲棲]


返回局部變量的地址

我們可能會經常寫出這樣的代碼:
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);  
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;  
} 

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


下麵的截圖是在我的電腦上運行的結果:

由此可以看出,應該顯示“Bruce”的地方,顯示的是不能識別的亂碼,由此,驗證了上麵的說法。
所以,我們在編寫程序的時候需要注意,返回值如果是值,可以大膽的操作,但是,如如果返回的是地址,那麼我們就需要考慮是不是局部自動變量的問題了。


裝載自:https://blog.csdn.net/dlutbrucezhang/article/details/9528885

 

最後更新:2017-04-03 16:48:54

  上一篇:go 某網站頁麵優化方案
  下一篇:go 指針與字符串:(const)char *p2 = &quot;lmj&quot;;定義的是一個字符串常量!符串常量,正因為是常量,所以它內部的字符是不允許修改的。