返回區域性變數的問題

2021-07-04 05:35:37 字數 1579 閱讀 8467

眾所周知,函式返回區域性變數的型別至關重要。由於指標和引用是一類特殊的型別,所以返回區域性物件的指標或引用需格外注意。正確情況下,作為函式返回值的區域性指標,其所指向物件的作用域應該是呼叫者作用域、全域性或靜態常量區;指向棧空間物件的指標作為返回值,存在潛在的錯誤。

1、 

返回區域性變數的值

例如 int num()

int a=2;

return a;

當返回型別不是引用時,編譯器會在呼叫函式處複製區域性物件,並返回區域性物件的副本。所以函式先返回a

的副本(值),然後

a被登出,

不存在問題。

注意:此時由於a所佔的記憶體位於棧中,所以當函式結束時,a的記憶體會被銷毀掉。當再次呼叫函式時,會重新分配記憶體。故有一下結果:

int num()

int a=2;        //此時a

被分配在棧區,函式結束後自動銷毀記憶體

return ++a;

int num1()

static int a=2;    //此時a

被分配在靜態區,不會隨著函式的結束而銷毀記憶體

return ++a;

int main()

int i=num();

cout << i cout << j cout << i1 cout << j1 2、 

返回區域性指標變數

2.1、返回區域性指標執行呼叫者作用域的物件

char* strcpy( char *strdest, const char *strsrc )

assert((strdest != null) &&(strsrc != null) );

char*strcopy = strdest;

while((*strdest++ = * strsrc++) != 『/0』 );

returnstrcopy;

strcopy

雖然是區域性指標變數,但返回的

strcopy

副本實質是指向呼叫者呼叫時傳入的

strdest

位址物件,所以

strcpy

棧空間釋放後,

strcopy

被登出但並不影響。

2.2、返回區域性指標指向全域性或靜態常量作用域的物件

char *retarr()

char *arr="hello"; "hello "

存放在唯讀常量區,非棧記憶體空間不受函式返回影響。

2.3錯誤返回區域性指標的情形:返回執行區域性物件的指標

char* retarr(void)

char arr="hello,world/n";

//或static chararr="hello,world/n";

return arr;

char arr="hello,world/n";

arr所有元素保持在棧記憶體上,

arr是個符號位址,沒有儲存空間

。當棧記憶體都會被**後,返回的

arr的副本所指位址可能已經不再是

"hello,world/n"

(由系統釋放棧空間的時間覺得),所以存在潛在的風險。

返回區域性變數的問題

函式返回區域性變數,是返回區域性變數的值。但指標 或位址 是一種特殊的值,所以返回區域性指標變數需要特別注意。正確情況下,作為函式返回值的區域性指標,其所指向物件的作用域應該是呼叫者作用域 全域性或靜態常量區 指向棧空間物件的指標作為返回值,存在潛在的錯誤。1.返回區域性值變數 函式返回時,將返回a...

返回區域性變數的問題

函式返回區域性變數,是返回區域性變數的值。但指標 或位址 是一種特殊的值,所以返回區域性指標變數需要特別注意。正確情況下,作為函式返回值的區域性指標,其所指向物件的作用域應該是呼叫者作用域 全域性或靜態常量區 指向棧空間物件的指標作為返回值,存在潛在的錯誤。1.返回區域性值變數 int num vo...

函式返回區域性變數的問題

1.返回區域性變數的值 可以有兩種情況 返回區域性自動變數和區域性靜態變數,比如,int func 區域性變數temp儲存在棧中,函式返回時會自動複製乙份temp的copy給呼叫者,沒有問題。int func 區域性變數a儲存在靜態 全域性 儲存區中,從初始化後一直有效直到程式結束,僅分配一次記憶體...