程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++返回局部變量的地址

C++返回局部變量的地址

編輯:關於C++

我們可能會經常寫出這樣的代碼:

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;     //www.bianceng.cn

}

這裡有問題嗎?不是和上面一樣嗎?

當然不一樣,上面的函數返回的是一個具體值,但是這個函數但會的是一個地址,那麼,函數不可以返回地址嗎?當然可以,只是,這裡不行。

這裡的地址是一個局部變量 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;  
}

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

由此可以看出,應該顯示“Bruce”的地方,顯示的是不能識別的亂碼,由此,驗證了上面的說法。

所以,我們在編寫程序的時候需要注意,返回值如果是值,可以大膽的操作,但是,如如果返回的是地址,那麼我們就需要考慮是不是局部自動變量的問題了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved