最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【零基礎(chǔ)學(xué)C語言】?jī)?nèi)存知識(shí)總結(jié):realloc函數(shù)和free函數(shù)

2022-10-21 16:01 作者:C語言編程__Plus  | 我要投稿



realloc函數(shù)

realloc()函數(shù)可以重用或擴(kuò)展以前用malloc()、calloc()及realloc()函數(shù)自身分配的內(nèi)存。

函數(shù)原型:

? ? ? ? 先判斷當(dāng)前的指針是否有足夠的連續(xù)空間,如果有,擴(kuò)大mem_address指向的地址,并且將 mem_address返回,如果空間不夠,先按照 newsize 指定的大小分配空間,將原有數(shù)據(jù)從頭到尾拷貝到新分配的內(nèi)存區(qū)域,而后釋放原來 mem_address 所指內(nèi)存區(qū)域(注意:原來指針是自動(dòng)釋放,不需要使用free),同時(shí)返回新分配的內(nèi)存區(qū)域的首地址。即重新分配存儲(chǔ)器塊的地址。

1、 realloc()函數(shù)需兩個(gè)參數(shù):一個(gè)是包含地址的指針(該地址由之前的malloc()、calloc()或realloc()函數(shù)返回),另一個(gè)是要新分配的內(nèi)存字節(jié)數(shù)。

2、 realloc()函數(shù)分配第二個(gè)參數(shù)指定的內(nèi)存量,并把第一個(gè)參數(shù)指針指向的之前分配的內(nèi)容復(fù)制到新配的內(nèi)存中,且復(fù)制的內(nèi)容長(zhǎng)度等于新舊內(nèi)存區(qū)域中較小的那一個(gè)。即新內(nèi)存大于原內(nèi)存,則原內(nèi)存所有內(nèi)容復(fù)制到新內(nèi)存,如果新內(nèi)存小于原內(nèi)存,只復(fù)制長(zhǎng)度等于新內(nèi)存空間的內(nèi)容。

3、realloc()函數(shù)的第一個(gè)參數(shù)若為空指針,相當(dāng)于分配第二個(gè)參數(shù)指定的新內(nèi)存空間,此時(shí)等價(jià)于malloc()、calloc()或realloc()函數(shù)。

4、如果是將分配的內(nèi)存擴(kuò)大,則有以下3種情況:

? ? 1)? 如果當(dāng)前內(nèi)存段后面有需要的內(nèi)存空間,則直接擴(kuò)展這段內(nèi)存空間,realloc()將返回原指針。

? ? 2)? 如果當(dāng)前內(nèi)存段后面的空閑字節(jié)不夠,那么就使用堆中的第一個(gè)能夠滿足這一要求的內(nèi)存塊,將目前的數(shù)據(jù)復(fù)制到新的位置,并將原來的數(shù)據(jù)塊釋放掉,返回新的內(nèi)存塊地址位置。

? ? 3)? 如果申請(qǐng)失敗,將返回NULL,此時(shí),原來的指針仍然有效。

注意事項(xiàng):

1、第一個(gè)參數(shù)要么是空指針,要么是指向以前分配的內(nèi)存。如果不指向以前分配的內(nèi)存或指向已釋放的內(nèi)存,結(jié)果就是不確定的。

2、 如果調(diào)用成功,不管當(dāng)前內(nèi)存段后面的空閑空間是否滿足要求,都會(huì)釋放掉原來的指針,重新返回一個(gè)指針,雖然返回的指針有可能和原來的指針一樣,即不能再次釋放掉原來的指針。

返回值:如果重新分配成功則返回指向被分配內(nèi)存的指針,否則返回空指針NULL。

注意:這里原始內(nèi)存中的數(shù)據(jù)還是保持不變的。當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()等函數(shù)將內(nèi)存塊釋放

使用總結(jié):

(1)realloc失敗的時(shí)候,返回NULL

(2)realloc失敗的時(shí)候,原來的內(nèi)存不改變,不會(huì)釋放也不會(huì)移動(dòng)

(3)假如原來的內(nèi)存后面還有足夠多剩余內(nèi)存的話,realloc的內(nèi)存=原來的內(nèi)存+剩余內(nèi)存,realloc還是返回原來內(nèi)存的地址; 假如原來的內(nèi)存后面沒有足夠多剩余內(nèi)存的話,realloc將申請(qǐng)新的內(nèi)存,然后把原來的內(nèi)存數(shù)據(jù)拷貝到新內(nèi)存里,原來的內(nèi)存將被free掉,realloc返回新內(nèi)存的地址

(4)如果size為0,效果等同于free()。這里需要注意的是只對(duì)指針本身進(jìn)行釋放,例如對(duì)二維指針**a,對(duì)a調(diào)用realloc時(shí)只會(huì)釋放一維,使用時(shí)謹(jǐn)防內(nèi)存泄露。

(5)傳遞給realloc的指針必須是先前通過malloc(),calloc(), 或realloc()分配的

(6)傳遞給realloc的指針可以為空,等同于malloc。


malloc與free函數(shù)

malloc中文叫動(dòng)態(tài)內(nèi)存分配,用于申請(qǐng)一塊連續(xù)的指定大小的內(nèi)存塊區(qū)域以void*類型返回分配的內(nèi)存區(qū)域地址,當(dāng)無法知道內(nèi)存具體位置的時(shí)候,想要綁定真正的內(nèi)存空間,就需要用到動(dòng)態(tài)的分配內(nèi)存,且分配的大小就是程序要求的大小。

函數(shù)原型:

size為要申請(qǐng)的空間大小,需要我們手動(dòng)的去計(jì)算,如int *p = (int? * )malloc(20*sizeof(int)),如果編譯器默認(rèn)int為4字節(jié)存儲(chǔ)的話,那么計(jì)算結(jié)果是80 Byte,一次申請(qǐng)一個(gè)80 Byte的連續(xù)空間,并將空間基地址強(qiáng)制轉(zhuǎn)換為int類型,賦值給指針p,此時(shí)申請(qǐng)的內(nèi)存值是不確定的。

malloc函數(shù)的實(shí)質(zhì)體現(xiàn)在,它有一個(gè)將可用的內(nèi)存塊連接為一個(gè)長(zhǎng)長(zhǎng)的列表的所謂 空閑鏈表的功能。

調(diào)用malloc函數(shù)時(shí),它沿連接表尋找一個(gè)大到足以滿足用戶請(qǐng)求所需要的內(nèi)存塊。然后,將該內(nèi)存塊一分為二(一塊的大小與用戶請(qǐng)求的大小相等,另一塊的大小就是剩下的字節(jié))。接下來,將分配給用戶的那塊內(nèi)存?zhèn)鹘o用戶,并將剩下的那塊(如果有的話)返回到連接表上。

調(diào)用free函數(shù)時(shí),它將用戶釋放的內(nèi)存塊連接到空閑鏈上。到最后,空閑鏈會(huì)被切成很多的小內(nèi)存片段,如果這時(shí)用戶申請(qǐng)一個(gè)大的內(nèi)存片段,那么空閑鏈上可能沒有可以滿足用戶要求的片段了。

于是,malloc函數(shù)請(qǐng)求延時(shí),并開始在空閑鏈上翻箱倒柜地檢查各內(nèi)存片段,對(duì)它們進(jìn)行整理,將相鄰的小空閑塊合并成較大的內(nèi)存塊。如果無法獲得符合要求的內(nèi)存塊,malloc函數(shù)會(huì)返回NULL指針(空指針),因此在調(diào)用malloc動(dòng)態(tài)申請(qǐng)內(nèi)存塊時(shí),一定要進(jìn)行返回值的判斷。

free函數(shù):

free()是C語言中釋放內(nèi)存空間的函數(shù),通常與申請(qǐng)內(nèi)存空間的函數(shù)malloc()結(jié)合使用,可以釋放由 malloc()、calloc()、realloc() 等函數(shù)申請(qǐng)的內(nèi)存空間。

函數(shù)原型:

上面的例子:

總結(jié):

malloc 必須要由我們計(jì)算字節(jié)數(shù),并且在返回后強(qiáng)行轉(zhuǎn)換為實(shí)際類型的指針。另外有一點(diǎn)不能直接看出的區(qū)別是,malloc 只管分配內(nèi)存,并不能對(duì)所得的內(nèi)存進(jìn)行初始化,所以得到的一片新內(nèi)存中,其值將是隨機(jī)的

一般使用后要使用free(起始地址的指針) 對(duì)內(nèi)存進(jìn)行釋放,不然內(nèi)存申請(qǐng)過多會(huì)導(dǎo)致內(nèi)存泄漏會(huì)影響計(jì)算機(jī)的性能,以至于得重啟電腦。如果使用過后不清零,還可以使用該指針對(duì)該塊內(nèi)存進(jìn)行訪問。

通常,malloc函數(shù)要和free函數(shù)一起配對(duì)使用,free函數(shù)的參數(shù)是之前mallloc函數(shù)返回的地址(指針),該函數(shù)釋放之前malloc函數(shù)分配的內(nèi)存,因此,動(dòng)態(tài)內(nèi)存分配的存儲(chǔ)期是從動(dòng)態(tài)內(nèi)存分配函數(shù)malloc(或其他)到f調(diào)用ree函數(shù)釋放內(nèi)存為止,涉嫌malloc和free函數(shù)管理著一個(gè)內(nèi)存池。

每次調(diào)用malloc分配內(nèi)存給程序使用,每次調(diào)用free函數(shù)把內(nèi)存空間歸還給內(nèi)存池中,這樣便可以重復(fù)使用這些內(nèi)存,free函數(shù)的參數(shù)應(yīng)該是一個(gè)指針,指向由malloc函數(shù)分配的一塊內(nèi)存,不能用free函數(shù)釋放通過其他方式(如 :聲明一個(gè)數(shù)組),分配的內(nèi)存,malloc函數(shù)和free函數(shù)的原型都在stdio.h頭文件中。

作者:Mr_Li_

另外的話為了幫助大家,輕松,高效學(xué)習(xí)C語言/C++,我給大家分享我收集的資源,從最零基礎(chǔ)開始的教程到C語言項(xiàng)目案例,幫助大家在學(xué)習(xí)C語言的道路上披荊斬棘!

C語言/C++編程學(xué)習(xí)資料分享:

整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)最重要的是你可以在群里面交流提問編程問題哦?。ā?/p>


【零基礎(chǔ)學(xué)C語言】?jī)?nèi)存知識(shí)總結(jié):realloc函數(shù)和free函數(shù)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
洪泽县| 那坡县| 龙山县| 子洲县| 东乌| 大名县| 准格尔旗| 铜鼓县| 大姚县| 扎兰屯市| 延吉市| 弥渡县| 隆尧县| 巴彦县| 新闻| 石城县| 溧阳市| 开封市| 建水县| 宜宾市| 鹤庆县| 武宁县| 瓦房店市| 林甸县| 南充市| 天门市| 福安市| 公主岭市| 崇左市| 徐州市| 富蕴县| 昂仁县| 平舆县| 长乐市| 融水| 旺苍县| 嵊州市| 革吉县| 襄汾县| 无锡市| 荔浦县|