通過上一篇的講解,相信大家已經(jīng)明白直接的return數(shù)組的問題以及原因了,今天我們將詳細為大家講解在函數(shù)中返回數(shù)組的常見辦法。
此類問題,應(yīng)用場景往往為了解決函數(shù)間相互通信,比如某個函數(shù)內(nèi)處理的完的結(jié)果數(shù)據(jù)需要交接給另一個函數(shù)的情況,那么一般來說,總結(jié)有以下三種:
- 直接使用全局變量:這種方法最方便,但此方法打破了函數(shù)間的通信及封裝的思想,所以不推薦使用,不在今天討論范圍之內(nèi)。
- 通過堆區(qū)動態(tài)開辟內(nèi)存解決:C語言中,我們通常用malloc來在堆區(qū)動態(tài)開辟內(nèi)存,利用堆區(qū)“現(xiàn)用現(xiàn)開辟,用完手動收回”特點,實現(xiàn)靈活管理。是實際開發(fā)中的常用辦法,也是我們今天的主要內(nèi)容。
- 由調(diào)用方傳入數(shù)組指針:此種方法不需要函數(shù)返回地址,而是在調(diào)用時直接 傳入數(shù)組地址,委托被調(diào)用方進行操作,由于此局部變量屬于調(diào)用方本身,故即便被調(diào)用方結(jié)束內(nèi)存釋放,也不會被影響到該數(shù)組。
下面逐個實驗,對于第二種方法,由于動態(tài)開辟內(nèi)存在堆區(qū),堆區(qū)不想上一講中局部變量在棧區(qū)存儲,系統(tǒng)根據(jù)它的生命周期自動收回,而是手動開辟,手動釋放,這樣就可以完全規(guī)避問題,例子與效果見下圖:
需要注意的是:記得用完free掉,防止內(nèi)存泄露!
第三種方法:雖然沒有在函數(shù)中返回數(shù)組,但也可以解決數(shù)組通信問題,主要思路就是調(diào)用方中定義數(shù)組,然后將地址傳入,由于該內(nèi)存屬于調(diào)用方,而非被調(diào)用方,故被調(diào)用方在調(diào)用結(jié)束后釋放掉內(nèi)存也無所謂。例子程序及效果如下:
關(guān)于數(shù)組使用傳遞的總結(jié),大體如上,大家有任何問題和疑問還可以聯(lián)系我們!
C語言研究中心(www.sztianhecheng.cn)