下文來自
一般的來說,函式是可以返回區域性變數的。 區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址(指標)的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被釋放了,這樣指標指向的內容就是不可預料的內容,呼叫就會出錯。準確的來說,函式不能通過返回指向棧記憶體的指標(注意這裡指的是棧,返回指向堆記憶體的指標是可以的)。
下面以函式返回區域性變數的指標舉幾個典型的例子來說明:
1:#include
char *returnstr()
int main()
這個沒有任何問題,因為"hello world!"是乙個字串常量,存放在唯讀資料段,把該字串常量存放的唯讀資料段的首位址賦值給了指標,所以returnstr函式退出時,該該字串常量所在記憶體不會被**,故能夠通過指標順利無誤的訪問。
2:#include
char *returnstr()
int main()
"hello world!"是區域性變數存放在棧中。當returnstr函式退出時,棧要清空,區域性變數的記憶體也被清空了,所以這時的函式返回的是乙個已被釋放的記憶體位址,所以有可能列印出來的是亂碼。
3:int func()
int * func()
區域性變數也分區域性自動變數和區域性靜態變數,由於a返回的是值,因此返回乙個區域性變數是可以的,無論自動還是靜態,
因為這時候返回的是這個區域性變數的值,但不應該返回指向區域性自動變數的指標,因為函式呼叫結束後該區域性自動變數
被拋棄,這個指標指向乙個不再存在的物件,是無意義的。但可以返回指向區域性靜態變數的指標,因為靜態變數的生存
期從定義起到程式結束。
#include
char *returnstr()
int main()
5: 陣列是不能作為函式的返回值的,原因是編譯器把陣列名認為是區域性變數(陣列)的位址。返回乙個陣列一般用返回指向這個陣列的指標代替,而且這個指標不能指向乙個自動陣列,因為函式結束後自動陣列被拋棄,但可以返回乙個指向靜態區域性陣列的指標,因為靜態儲存期是從物件定義到程式結束的。如下:
int* func( void )
6:返回指向堆記憶體的指標是可以的
char *getmemory3(int num)
void test3(void)
程式在執行的時候用 malloc 申請任意多少的記憶體,程式設計師自己負責在何時用 free釋放記憶體。動態記憶體的生存期由程式設計師自己決定,使用非常靈活。
區域性變數作為返回值問題
函式返回區域性變數,是返回區域性變數的值。但指標 或位址 是一種特殊的值,所以返回區域性指標變數需要特別注意。正確情況下,作為函式返回值的區域性指標,其所指向物件的作用域應該是 呼叫者作用域 全域性或靜態常量區 指向棧空間物件的指標作為返回值,存在潛在的錯誤。1.返回區域性值變數 cpp view ...
函式返回值 返回區域性變數
因為有一篇文章寫的比較清楚,我自已就沒有多寫,貼在這裡,方便檢視.看看下面的程式的輸出 include char returnstr int main 這個沒有任何問題,因為 hello world 是乙個字串常量,存放在靜態資料區,把該字串常量存放的靜態資料區的首位址賦值給了指標,所以return...
函式返回值 返回區域性變數
函式返回值 返回區域性變數 老徐 看看下面的程式的輸出 include char returnstr int main 這個沒有任何問題,因為 hello world 是乙個字串常量,存放在靜態資料區,把該字串常量存放的靜態資料區的首位址賦值給了指標,所以returnstr函式退出時,該該字串常量所...