區域性變數作為返回值問題

2021-06-21 16:09:49 字數 1242 閱讀 8008

函式返回區域性變數,是返回區域性變數的值。但指標(或位址)是一種特殊的值,所以返回區域性指標變數需要特別注意。正確情況下,作為函式返回值的區域性指標,其所指向物件的作用域應該是

呼叫者作用域、全域性或靜態常量區

;指向棧空間物件的指標作為返回值,存在潛在的錯誤。

1.       返回區域性值變數

[cpp]view plain

copy

int num(

void)    

函式返回時,將返回a的副本(值),然後a被登出,所以不存在問題。

2.       返回區域性指標變數

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

[cpp]view plain

copy

char * strcpy( 

char *strdest, const

char *strsrc )  

strcopy雖然是區域性指標變數,但返回的strcopy副本實質是指向呼叫者呼叫時傳入的strdest位址物件,所以strcpy棧空間釋放後,strcopy被登出但並不影響。

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

[cpp]view plain

copy

char * retarr(

void)  

char *arr="hello,world/n"; "hello,world/n"存放在唯讀常量區,非棧記憶體空間不受函式返回影響。

static char arr="hello,world/n"; "hello,world/n"存放在靜態儲存區(與全域性變數相同),也不受函式返回的影響。

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

[cpp]view plain

copy

char * retarr(

void)  

char arr="hello,world/n"; arr所有元素保持在棧記憶體上,arr是個符號位址,沒有儲存空間。當棧記憶體都會被**後,返回的arr的副本所指位址可能已經不再是"hello,world/n"(由系統釋放棧空間的時間覺得),所以存在潛在的風險。

函式返回值 返回區域性變數

因為有一篇文章寫的比較清楚,我自已就沒有多寫,貼在這裡,方便檢視.看看下面的程式的輸出 include char returnstr int main 這個沒有任何問題,因為 hello world 是乙個字串常量,存放在靜態資料區,把該字串常量存放的靜態資料區的首位址賦值給了指標,所以return...

函式返回值 返回區域性變數

函式返回值 返回區域性變數 老徐 看看下面的程式的輸出 include char returnstr int main 這個沒有任何問題,因為 hello world 是乙個字串常量,存放在靜態資料區,把該字串常量存放的靜態資料區的首位址賦值給了指標,所以returnstr函式退出時,該該字串常量所...

c語言 區域性變數做返回值 問題

下文來自 一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的...