C語言函式中區域性變數的返回

2021-09-30 14:33:49 字數 2313 閱讀 4624



c/c++中,函式內部的一切變數(函式內部區域性變數,形參 )都是在其被呼叫時才被分配記憶體單元。子函式執行結束時,所有區域性變數的記憶體單元會被系統釋放。形參和函式內部的區域性變數的生命期和作用域都是在函式內部( static變數的生命期除外)。

在c中,函式被呼叫時的傳參方式有兩種形式:傳值和傳址。

傳址的好處:

(1)能在函式內部通過實參位址間接地改變實參的值。

(2)當所傳實參內容比較龐大時,傳址只是複製了整個實參的位址過去,指標依據同乙個位址訪問實參變數。而傳值就會將實參內容整個拷貝過去,形參會跟實參佔一樣大的記憶體,棧空間是有限的。當然了,在弱小的程式中,傳址的這個優點不會被體現出來。

在函式中,可以隨意的返回乙個區域性變數。但如果返回乙個區域性變數的位址(指標 ),編譯器就會給出警告(編譯器也不可能那麼完美能夠徹底的檢查出段錯誤)。在函式內部返區域性指標這的確是乙個危險的操作。

linux等的c語言中return返回值的機制為:將返回值存入eax暫存器中,然後系統再將eax中的值賦給變數(i)。

其實,只要遵守一句話即可:函式不能返回指向棧記憶體的指標!

為什麼?因為返回的都是值拷貝!
我們知道,區域性變數的作用域是函式內部,函式一旦執行結束,棧上的區域性變數會進行銷毀,記憶體得到釋放。因此,此時函式返回的是該區域性變數的值拷貝,這是沒有問題的。但是如果返回的是區域性變數的位址,那麼返回的只是該區域性變數指標的拷貝,而隨著函式執行結束,該拷貝指標所指向的棧記憶體已經被釋放,那麼指向乙個未知區域就會導致呼叫的錯誤。

1.正確。最normal的情況。

int returnvalue();

int _tmain(int argc, _tchar* ar**)

char returnvalue()

2.錯誤。最normal錯誤。雖然value被釋放,但是它的值不一定會被清除,所以有時候你這麼用看起來結果好像也是對的,但是隱患無窮。

int* returnvalue();

int _tmain(int argc, _tchar* ar**)

int* returnvalue()

3.正確。不用奇怪,「hellojacky」是乙個字串常量,儲存在唯讀資料段,return str只是返回了該字串在唯讀資料段所在的首位址,當函式退出後,該字串所在的記憶體不會被**,所以是正常的。

char* returnvalue();

int_tmain(int argc, _tchar* ar**)

char* returnvalue()

4.錯誤。這一回「hellojacky」是棧內的區域性變數,函式退出時記憶體被釋放,因此返回棧內區域性變數的位址是錯誤的。

char* returnvalue();

int_tmain(int argc, _tchar* ar**)

char* returnvalue()

5.正確。如果你非要返回乙個區域性變數的位址,那麼加上static吧。

char* returnvalue();

int_tmain(int argc, _tchar* ar**)

char* returnvalue()

6.錯誤,一樣的,陣列也不能作為函式的返回值,因為陣列名其實是區域性變數的首位址。

int* returnvalue();

int _tmain(int argc, _tchar* ar**)

int* returnvalue()

; return

value;

}

7.正確。加上static修飾符吧,那陣列也可以返回了。

int* returnvalue();

int _tmain(int argc, _tchar* ar**)

int* returnvalue()

; return

value;

}

8.正確。函式內申請空間,呼叫後釋放空間,只是這樣做的壞處就如上面所說介面不靈活。

char* newmemory(int size);

int _tmain(int argc, _tchar* ar**)

std::cout

<<*p;

delete p;

return0;}

char* newmemory(int size)

函式中區域性變數的返回

一般說來,函式中是可以進行區域性變數的返回的,不然豈不是全部要用全域性變數,如果使用了全域性變數,那還有必要進行返回嗎?那函式就沒有它存在的意義了!但是要注意了,這裡所謂的區域性變數的返回很有內涵,什麼樣的值才可以進行返回而不出錯?其實,只要遵守一句話即可 函式不能返回指向棧記憶體的指標!為什麼?因...

C語言 返回區域性變數

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

C 函式返回區域性變數

原因 返回值是拷貝值,區域性變數的作用域為函式內部,函式執行結束,棧上的區域性變數會銷毀,記憶體釋放。可返回的區域性變數 1.返回區域性變數本身 int sum int a,int b 2.常量 char returnvalue warning deprecatedconversion from s...