前言
最近在刷題,在寫矩陣的快速冪的題時,對於返回值是數組的程序,寫的十分冗雜。借此機會,重新梳理下C語言中函數的返回值與變量類型的關系。
按照變量的壽命,可以分為三種類型
1.靜態變量 壽命從程序開始運行,到程序關閉結束 儲存在靜態儲存區中
2.自動變量 壽命從聲明該變量的語句塊到結束為止 儲存在棧中,系統自動釋放
3.通過malloc()分配的 壽命直到free()為止 儲存在堆中,由用戶自主釋放
函數的返回值
之前自己有寫過一個關於迷宮的demo,但是總是調試出錯,請教別人后發現,自己在函數中,返回了一個數組。
第一個例子,如果定義以下函數,可以成功獲取到你想得到的值。
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可以幫助改正一些不良習慣。
