前言
最近在刷題,在寫矩陣的快速冪的題時,對於返回值是陣列的程式,寫的十分冗雜。藉此機會,重新梳理下c語言中函式的返回值與變數型別的關係。
按照變數的壽命,可以分為三種型別
1.靜態變數 壽命從程式開始執行,到程式關閉結束 儲存在靜態儲存區中
2.自動變數 壽命從宣告該變數的語句塊到結束為止 儲存在棧中,系統自動釋放
3.通過malloc()分配的 壽命直到free()為止 儲存在堆中,由使用者自主釋放
函式的返回值
之前自己有寫過乙個關於迷宮的demo,但是總是除錯出錯,請教別人後發現,自己在函式中,返回了乙個陣列。
第乙個例子,如果定義以下函式,可以成功獲取到你想得到的值。
int第二個例子,下面這個函式,我們想讓他返回乙個陣列,卻無法獲取到我們想要的值。hoge()
intmain()
//t = 10
int *hoge();所以,想解決第二個例子的問題,只要把a的記憶體申請方式,改為用malloc()函式申請就好了。returna;}
intmain()
//我的編譯器提示 [warning] address of local variable 'a' returned [-wreturn-local-addr]
//如果想強行輸出 t ,那麼輸出的就是亂碼啦 如果沒有輸出亂碼,只是運氣好,取決於編譯環境
對比上面兩個例子,我們可以看出,函式,可以返回乙個值,如果返回乙個位址,我們不一定能在這個位址中取出我們想要的值。
第乙個例子中,返回的是10,第二個例子返回的是個指標。
但是由於,第二個例子中,a 所指向的那片內存在函式呼叫結束後被釋放(儲存在棧中),所以,我們無法成功的取出位址中的值。
第三個例子
上面的**在vs2017報錯,但是在dev c中可以執行,且tt 的值為 "abcdefg",因為此處的"abcdefg"是字串常量,儲存在靜態儲存區,而不是棧中,在函式呼叫結束之後,也可以在返回的位址下,取出我們想要的字串。
第四個例子
這個顯然沒有正確輸出"abcdefg",因為此處的"abcdefg"是個字元陣列,儲存在棧中,函式呼叫後,字元陣列被釋放,我們無法取出我們想要的內容。
ps 如果在閱讀過程中發現我寫的不嚴謹的地方,可以指出來,我會虛心接受!
另外,平日編碼過程中,使用一些好的ide可以幫助改正一些不良習慣。
C 函式返回值型別
c 語言的函式返回值型別可以分為內部型別和自定義型別兩大類。在函式返回內部型別中不能返回陣列型別但可以返回指向陣列的指標,同樣也可以返回指向函式的函式指標。如果希望返回值可以作為左值 即可以放在賦值操作符左邊的 那就必須返回引用型別。而在函式返回自定義型別 即返回類型別 中根據是否可作為左值,返回值...
函式的變數和返回值
一 函式的變數 1.函式變數分為區域性變數和全域性變數 區域性變數 在python中的任何變數都有特定的作用域,在函式中定義的變數一般只能在該函式內部使用,這些只能在程式的特定部分使用的變數我們稱之為區域性變數 全域性變數 在乙個檔案頂部定義的變數可以供檔案中的任何函式呼叫,這些可以為整個程式所使用...
C語言函式返回值為指標和函式返回值為void
有時遇到函式返回值為空和函式返回值為指標的情況下,需要在前面定義該函式 函式的返回值為指標也必須在此定義,函式的返回值為void必須在此定義,返回值是整形或者其他基本型別不需要在此定義 函式功能 把格式化的資料寫入某個字串 函式原型 int sprintf char buffer,const cha...