溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言如何自定義函數(shù)實(shí)現(xiàn)返回?cái)?shù)組

發(fā)布時(shí)間:2020-06-17 14:21:36 來(lái)源:億速云 閱讀:312 作者:鴿子 欄目:編程語(yǔ)言

最近看到一些同學(xué)問(wèn)題,有提到說(shuō):如何在一個(gè)函數(shù)中返回?cái)?shù)組呢?

能否直接在自定義 函數(shù)中,寫成char *類型返回值,直接返回呢?,代碼如下:

C語(yǔ)言如何自定義函數(shù)實(shí)現(xiàn)返回?cái)?shù)組

直接返回str數(shù)組名(注意不需要加&,還有好多同學(xué)犯這個(gè)錯(cuò))

但事實(shí)上,運(yùn)行結(jié)果并非正常,我們嘗試在調(diào)用函數(shù)中輸出,可以看到結(jié)果并非是原來(lái)內(nèi)容(當(dāng)然你的電腦輸出可能還不是這個(gè)樣子)

如下:

C語(yǔ)言如何自定義函數(shù)實(shí)現(xiàn)返回?cái)?shù)組

原因大家可以從str的屬性入手,str本身是一個(gè)自定義函數(shù)中的局部變量,是一個(gè)數(shù)組有一百個(gè)字節(jié),它的生命周期當(dāng)然也隨著它所在的函數(shù)一起,正所謂“一招天子一朝臣”,隨著fun函數(shù)調(diào)用的結(jié)束,其中的各種局部變量也將被系統(tǒng)收回,理所當(dāng)然的str數(shù)組這一百個(gè)字節(jié)也將被收回,所以”Hello www.dotcpp.com”這串字符串也就灰飛煙滅了!自然你在main函數(shù)里再輸出肯定已經(jīng)不是原來(lái)的內(nèi)容了!

怎么樣,可以理解吧!

不過(guò),還沒(méi)有結(jié)束,依然有同學(xué)繼續(xù)問(wèn),可為什么我換成下面這種寫法就可以了呢?

如下圖:

C語(yǔ)言如何自定義函數(shù)實(shí)現(xiàn)返回?cái)?shù)組

答曰:這種寫法情況下,str雖也屬于是局部變量,但不是一個(gè)數(shù)組,而是一個(gè)指針,只有四個(gè)字節(jié),存的是在常量區(qū)的字符串” Hello www.dotcpp.com”,但請(qǐng)注意,這個(gè)字符串在常量區(qū),而不屬于fun函數(shù)里的部分,全程序都可讀,所以return之后依舊存在,返回的是str里的值,也就是字符串“Hello www.dotcpp.com”的首地址,是一個(gè)數(shù),其實(shí)相當(dāng)于把這個(gè)字符串的地址在str手里通過(guò)返回值轉(zhuǎn)交到p里。

也可以打個(gè)比方:之前只有fun函數(shù)知道這個(gè)字符串,但現(xiàn)在已經(jīng)馬上不行了,臨終前,交代:“我快不行了,趕緊把‘Hello www.dotcpp.com’的藏寶地址(字符串首地址)轉(zhuǎn)交到main函數(shù)里!”

然后就return 快馬加鞭的返回到main函數(shù)手里了!隨后消失…

而后,main函數(shù)獲得之后,你們也就知道了…

這樣講,大家能理解嗎?

后期C語(yǔ)言逆向分析部分,也會(huì)有涉及到此處的原理,大家可以再深入學(xué)習(xí)理解。

同時(shí),下篇我們將為大家講解如何實(shí)現(xiàn)自定義函數(shù)的數(shù)組傳遞問(wèn)題!

通過(guò)上一篇的講解,相信大家已經(jīng)明白直接的return數(shù)組的問(wèn)題以及原因了,今天我們將詳細(xì)為大家講解在函數(shù)中返回?cái)?shù)組的常見(jiàn)辦法。

此類問(wèn)題,應(yīng)用場(chǎng)景往往為了解決函數(shù)間相互通信,比如某個(gè)函數(shù)內(nèi)處理的完的結(jié)果數(shù)據(jù)需要交接給另一個(gè)函數(shù)的情況,那么一般來(lái)說(shuō),總結(jié)有以下三種:

1、直接使用全局變量:這種方法最方便,但此方法打破了函數(shù)間的通信及封裝的思想,所以不推薦使用,不在今天討論范圍之內(nèi)。

2、通過(guò)堆區(qū)動(dòng)態(tài)開(kāi)辟內(nèi)存解決:C語(yǔ)言中,我們通常用malloc來(lái)在堆區(qū)動(dòng)態(tài)開(kāi)辟內(nèi)存,利用堆區(qū)“現(xiàn)用現(xiàn)開(kāi)辟,用完手動(dòng)收回”特點(diǎn),實(shí)現(xiàn)靈活管理。是實(shí)際開(kāi)發(fā)中的常用辦法,也是我們今天的主要內(nèi)容。

3、由調(diào)用方傳入數(shù)組指針:此種方法不需要函數(shù)返回地址,而是在調(diào)用時(shí)直接 傳入數(shù)組地址,委托被調(diào)用方進(jìn)行操作,由于此局部變量屬于調(diào)用方本身,故即便被調(diào)用方結(jié)束內(nèi)存釋放,也不會(huì)被影響到該數(shù)組。

下面逐個(gè)實(shí)驗(yàn),對(duì)于第二種方法,由于動(dòng)態(tài)開(kāi)辟內(nèi)存在堆區(qū),堆區(qū)不想上一講中局部變量在棧區(qū)存儲(chǔ),系統(tǒng)根據(jù)它的生命周期自動(dòng)收回,而是手動(dòng)開(kāi)辟,手動(dòng)釋放,這樣就可以完全規(guī)避問(wèn)題,例子與效果見(jiàn)下圖:

需要注意的是:記得用完free掉,防止內(nèi)存泄露!

C語(yǔ)言如何自定義函數(shù)實(shí)現(xiàn)返回?cái)?shù)組

第三種方法:雖然沒(méi)有在函數(shù)中返回?cái)?shù)組,但也可以解決數(shù)組通信問(wèn)題,主要思路就是調(diào)用方中定義數(shù)組,然后將地址傳入,由于該內(nèi)存屬于調(diào)用方,而非被調(diào)用方,故被調(diào)用方在調(diào)用結(jié)束后釋放掉內(nèi)存也無(wú)所謂。例子程序及效果如下:

C語(yǔ)言如何自定義函數(shù)實(shí)現(xiàn)返回?cái)?shù)組

以上就是C語(yǔ)言自定義函數(shù)返回?cái)?shù)組的方法(圖文詳解)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注億速云其它相關(guān)文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI