函式返回區域性變數,是返回區域性變數的值。但指標(或位址)是一種特殊的值,所以返回區域性指標變數需要特別注意。正確情況下,作為函式返回值的區域性指標,其所指向物件的作用域應該是呼叫者作用域、全域性或靜態常量區;指向棧空間物件的指標作為返回值,存在潛在的錯誤。
1.
返回區域性值變數
函式返回時,將返回a的副本(值),然後a被登出,所以不存在問題。
2.
返回區域性指標變數
2.1 返回區域性指標執行呼叫者作用域的物件
strcopy雖然是區域性指標變數,但返回的strcopy副本實質是指向呼叫者呼叫時傳入的strdest位址物件,所以strcpy棧空間釋放後,strcopy被登出但並不影響。
2.2返回區域性指標執行全域性或靜態常量作用域的物件
char
*arr="hello,world/n"; "hello,world/n"存放在唯讀常量區,非棧記憶體空間不受函式返回影響。
static
char arr="hello,world/n"; "hello,world/n"存放在靜態儲存區(與全域性變數相同),也不受函式返回的影響。
2.3錯誤返回區域性指標的情形:返回執行區域性物件的指標
char
arr="hello,world/n"; arr所有元素保持在棧記憶體上,arr是個符號位址,沒有儲存空間。當棧記憶體都會被**後,返回的arr的副本所指位址可能已經不再是"hello,world/n"(由系統釋放棧空間的時間覺得),所以存在潛在的風險。
返回區域性變數的問題
函式返回區域性變數,是返回區域性變數的值。但指標 或位址 是一種特殊的值,所以返回區域性指標變數需要特別注意。正確情況下,作為函式返回值的區域性指標,其所指向物件的作用域應該是呼叫者作用域 全域性或靜態常量區 指向棧空間物件的指標作為返回值,存在潛在的錯誤。1.返回區域性值變數 int num vo...
返回區域性變數的問題
眾所周知,函式返回區域性變數的型別至關重要。由於指標和引用是一類特殊的型別,所以返回區域性物件的指標或引用需格外注意。正確情況下,作為函式返回值的區域性指標,其所指向物件的作用域應該是呼叫者作用域 全域性或靜態常量區 指向棧空間物件的指標作為返回值,存在潛在的錯誤。1 返回區域性變數的值 例如 in...
函式返回區域性變數的問題
1.返回區域性變數的值 可以有兩種情況 返回區域性自動變數和區域性靜態變數,比如,int func 區域性變數temp儲存在棧中,函式返回時會自動複製乙份temp的copy給呼叫者,沒有問題。int func 區域性變數a儲存在靜態 全域性 儲存區中,從初始化後一直有效直到程式結束,僅分配一次記憶體...