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


前言

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM