前言數組
最近在刷題,在寫矩陣的快速冪的題時,對於返回值是數組的程序,寫的十分冗雜。藉此機會,從新梳理下C語言中函數的返回值與變量類型的關係。函數
按照變量的壽命,能夠分爲三種類型編碼
1.靜態變量 壽命從程序開始運行,到程序關閉結束 儲存在靜態儲存區中spa
2.自動變量 壽命從聲明該變量的語句塊到結束爲止 儲存在棧中,系統自動釋放指針
3.經過malloc()分配的 壽命直到free()爲止 儲存在堆中,由用戶自主釋放調試
函數的返回值code
以前本身有寫過一個關於迷宮的demo,可是老是調試出錯,請教別人後發現,本身在函數中,返回了一個數組。blog
第一個例子,若是定義如下函數,能夠成功獲取到你想獲得的值。內存
int hoge(){ int a =10; return a; } int main(){ int t = hoge(); return 0; }
//t = 10
第二個例子,下面這個函數,咱們想讓他返回一個數組,卻沒法獲取到咱們想要的值。字符串
int * hoge(){ int a[2] = {1,2}; return a; } int main(){ int *t = hoge(); return 0; }
//個人編譯器提示 [Warning] address of local variable 'a' returned [-Wreturn-local-addr]
//若是想強行輸出 t ,那麼輸出的就是亂碼啦 若是沒有輸出亂碼,只是運氣好,取決於編譯環境
因此,想解決第二個例子的問題,只要把a的內存申請方式,改成用malloc()函數申請就行了。
對比上面兩個例子,咱們能夠看出,函數,能夠返回一個值,若是返回一個地址,咱們不必定能在這個地址中取出咱們想要的值。
第一個例子中,返回的是10,第二個例子返回的是個指針。
可是因爲,第二個例子中,a 所指向的那片內存在函數調用結束後被釋放(儲存在棧中),因此,咱們沒法成功的取出地址中的值。
第三個例子
上面的代碼在vs2017報錯,可是在DEV C中能夠運行,且tt 的值爲 "abcdefg",由於此處的"abcdefg"是字符串常量,儲存在靜態儲存區,而不是棧中,在函數調用結束以後,也能夠在返回的地址下,取出咱們想要的字符串。
第四個例子
這個顯然沒有正確輸出"abcdefg",由於此處的"abcdefg"是個字符數組,儲存在棧中,函數調用後,字符數組被釋放,咱們沒法取出咱們想要的內容。
PS 若是在閱讀過程當中發現我寫的不嚴謹的地方,能夠指出來,我會虛心接受!
另外,平日編碼過程當中,使用一些好的IDE能夠幫助改正一些不良習慣。