程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 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;     //???????
}


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

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

這裡的地址是一個局部變量 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”的地方,顯示的是不能識別的亂碼,由此,驗證了上面的說法。

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

 

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