C語言函數返回值和變量類型

前言數組

  最近在刷題,在寫矩陣的快速冪的題時,對於返回值是數組的程序,寫的十分冗雜。藉此機會,從新梳理下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能夠幫助改正一些不良習慣。 

相關文章
相關標籤/搜索