0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

周立功“程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)”:深度解剖動態(tài)分布內(nèi)存的free()函數(shù)與realloc()函數(shù)

AGk5_ZLG_zhiyua ? 來源:ZLG致遠(yuǎn)電子 ? 作者:佚名 ? 2017-08-25 14:22 ? 次閱讀


周立功教授數(shù)年之心血之作《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》,書本內(nèi)容公開后,在電子行業(yè)掀起一片學(xué)習(xí)熱潮。經(jīng)周立功教授授權(quán),本公眾號特對本書內(nèi)容進(jìn)行連載,愿共勉之。

第一章為程序設(shè)計(jì)基礎(chǔ),本文為1.9.3 free()函數(shù)和1.9.4 realloc()函數(shù)。

>>>>1.9.3free()函數(shù)

對于程序而言,不可再訪問的內(nèi)存塊被稱為垃圾,留有垃圾的程序存在內(nèi)存泄漏現(xiàn)象。雖然一些語言提供了垃圾收集器用于垃圾的自動定位和回收,但C語言不提供。要求每個(gè)程序負(fù)責(zé)回收各自的垃圾,方法是調(diào)用free()函數(shù)釋放不需要的內(nèi)存。

通常malloc()要與free()配套使用,當(dāng)動態(tài)內(nèi)存使用完畢時(shí),如果不及時(shí)釋放的話,必然導(dǎo)致“內(nèi)存泄露(即內(nèi)存空間減少)”,進(jìn)而影響程序的正常運(yùn)行。釋放內(nèi)存的free()函數(shù)原型如下:

void free(void *pointer);

即將malloc()返回的指針pointer作為參數(shù)傳給free()釋放內(nèi)存。雖然free()函數(shù)允許收回不再需要的內(nèi)存,但使用此函數(shù)會導(dǎo)致一個(gè)新的問題:懸空指針。雖然調(diào)用free(pi)函數(shù)會釋放pi,但不會改變pi本身。如果忘記了pi不再指向有效內(nèi)存塊,那么混亂就有可能隨即而來:

char *pi = malloc(5);

free(pi);

strcpy(pi, "abc");// 錯(cuò)誤

即修改了pi指向的內(nèi)存是嚴(yán)重的錯(cuò)誤,因?yàn)槌绦驅(qū)Υ藘?nèi)存失去了控制權(quán)。事實(shí)上,懸空指針是很難發(fā)現(xiàn)的,因?yàn)閹讉€(gè)指針可能指向相同的內(nèi)存塊,在釋放內(nèi)存塊后,全部的指針都懸空了。有了free()函數(shù),也可以用malloc()在運(yùn)行時(shí)分配一塊連續(xù)的內(nèi)存空間,達(dá)到改變數(shù)組大小的目的。比如:

char * pi = malloc(5);

即變量pi指向已經(jīng)在堆內(nèi)分配的5個(gè)連續(xù)字節(jié),好像聲明了一個(gè)有5個(gè)字符的數(shù)組一樣,顯然動態(tài)數(shù)組就是分配在“堆”上,用指針變量引用的數(shù)組。分配動態(tài)數(shù)組的步驟如下:

● 聲明一個(gè)指針變量用于保存數(shù)組變量首元素的地址;

調(diào)用malloc()為數(shù)組變量中的元素分配內(nèi)存

●將malloc()的結(jié)果賦給指針變量。

由于不同的數(shù)據(jù)類型占用的內(nèi)存大小不一樣,其大小為數(shù)組變量元素個(gè)數(shù)乘以每個(gè)元素所占內(nèi)存的大小。比如,有5個(gè)int型元素的數(shù)組變量需要分配內(nèi)存。比如:

int *pi = malloc(5 * sizeof(int));

和數(shù)組不同的是,當(dāng)不再使用時(shí),必須釋放內(nèi)存。比如:

free(pi);

如果需要10個(gè)元素才夠用,那么應(yīng)該先釋放原內(nèi)存,然后再申請新內(nèi)存。比如:

free(pi);

pi = malloc(10 * sizeof(int));

顯然,存放在原內(nèi)存的數(shù)據(jù)不見了,為了保留原來的數(shù)據(jù),需要再做些工作:

int *temp = pi; //讓temp指向原內(nèi)存

pi = malloc(10 * sizeof(int)); //讓pi指向新內(nèi)存

memcpy(pi, temp, 5 * sizeof(int));//將原內(nèi)存的數(shù)據(jù)拷貝到新內(nèi)存

free(temp); //釋放原內(nèi)存

但上面的工作僅需一條語句即可完成,比如:

pi = realloc(pi, 10*sizeof(int));

由于free函數(shù)不會檢查傳入的指針是否為NULL,也不會在返回前將指針設(shè)置為NULL,因此程序員會創(chuàng)建自己的free函數(shù),saferfree函數(shù)的接口和實(shí)現(xiàn)詳見程序清單 1.49和程序清單 1.50。

程序清單1.49saferfree()函數(shù)的接口(saferFree.h)

1 #pragma once

2 void saferFree(void **pp);

程序清單1.50saferfreeh函數(shù)接口的實(shí)現(xiàn)(saferFree.c)

1 #include

2 #include

3

4 void saferFree(void **pp)

5 {

6 if(pp != NULL && *pp != NULL)

7 free(*pp);

8 *pp = NULL;

9 }

10 }

如果使用saferFree宏調(diào)用saferFree函數(shù),則可以省略類型轉(zhuǎn)換和傳遞指針的地址。即:

#define NewSaferFree(P) saferFree((void **)&p)

其調(diào)用形式如下:

int *pi = malloc(sizeof(int));

NewSaferFree(pi);

>>>1.9.4realloc()函數(shù)

alloc是allocate分配的縮寫,前綴re就是重新分配的意思。如果原內(nèi)存后面還有剩余的話,realloc()只是修改分配表,還是返回原內(nèi)存的地址;如果沒有剩余內(nèi)存的話,realloc()將申請新的內(nèi)存,然后將原內(nèi)存的數(shù)據(jù)拷貝到新內(nèi)存中,原內(nèi)存將被free()釋放掉,realloc()返回新內(nèi)存的地址。realloc()函數(shù)原型如下:

void *realloc(void *pointer, unsigned int size);

當(dāng)調(diào)用realloc()函數(shù)時(shí),point必須指向先前通過malloc、calloc或realloc的調(diào)用獲得的內(nèi)存塊。size表示新分配內(nèi)存的大小,以字節(jié)為單位。其作用是將pointer所指向的動態(tài)空間的大小改變?yōu)閟ize,pointer的值不變。如果重新分配不成功,則返回NULL;如果通過malloc()已經(jīng)獲得了動態(tài)空間,又不想改變其大小,則可以使用realloc()重新分配。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:周立功:動態(tài)分布內(nèi)存——free()函數(shù)與realloc()函數(shù)

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)立功數(shù)十年心血力作

    為了將實(shí)際開發(fā)過程中總結(jié)的有價(jià)值的技術(shù)應(yīng)用分享給大家,立功及其團(tuán)隊(duì)整理出《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》這本書,其內(nèi)容如同培訓(xùn)講師的教案,是
    發(fā)表于 05-26 10:06 ?29次閱讀

    立功手把手教你學(xué)嵌入式編程:函數(shù)指針與指針函數(shù)的應(yīng)用

    作者經(jīng)常聽嵌入式軟件開發(fā)者說,“我?guī)缀醪挥?b class='flag-5'>函數(shù)指針……”。言下之意,那些復(fù)雜的語法似乎毫無用處,而實(shí)際上很多人根本沒有認(rèn)識到其無窮的威力……本文將進(jìn)入程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)函數(shù)指針與指針
    的頭像 發(fā)表于 08-29 11:36 ?1.6w次閱讀

    立功教你學(xué)程序設(shè)計(jì)技術(shù):做好軟件模塊的分層設(shè)計(jì),回調(diào)函數(shù)要這樣寫

    立功教授數(shù)年之心血之作《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》以及《面向AMetal框架與接口的編程(上)》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復(fù)【編程】即可在線閱讀。書本內(nèi)容公開后
    的頭像 發(fā)表于 08-30 10:24 ?9517次閱讀

    立功教你學(xué)C語言編程與程序設(shè)計(jì):這樣寫函數(shù)指針數(shù)組最好用

    立功教授數(shù)年之心血之作《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》以及《面向AMetal框架與接口的編程(上)》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復(fù)【編程】即可在線閱讀。
    的頭像 發(fā)表于 08-31 14:06 ?6828次閱讀
    <b class='flag-5'>周</b><b class='flag-5'>立功</b>教你學(xué)C語言編程與<b class='flag-5'>程序設(shè)計(jì)</b>:這樣寫<b class='flag-5'>函數(shù)</b>指針數(shù)組最好用

    立功程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》:字符串函數(shù)

    本文為程序設(shè)計(jì)基礎(chǔ),本文為1.8.2 字符串常量第三點(diǎn):字符串函數(shù)。
    的頭像 發(fā)表于 09-05 09:18 ?5601次閱讀

    立功教授談迭代器模式設(shè)計(jì)

    近日立功教授公開了數(shù)年的心血之作《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》,電子版已無償性分享到電子工程師與高校群體下載,經(jīng)
    的頭像 發(fā)表于 09-26 13:51 ?6274次閱讀
    <b class='flag-5'>周</b><b class='flag-5'>立功</b>教授談迭代器模式設(shè)計(jì)

    新書創(chuàng)作談:立功教授數(shù)十年之心血力作《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)

    ` 近日,立功教授公開了數(shù)十年之心血力作《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》,此書在4月28日落筆,電子版已無償性分享到電子工程師與高校群體,在致遠(yuǎn)電子公眾號后臺回復(fù)關(guān)鍵字【
    發(fā)表于 05-15 18:04

    【完整資料】《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)立功數(shù)十年心血力作

    ,是立功和團(tuán)隊(duì)的讀書筆記和程序設(shè)計(jì)實(shí)踐的心得?!?b class='flag-5'>程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》重點(diǎn)闡述了三大方向內(nèi)容。C語言學(xué)習(xí)中的痛點(diǎn):針對當(dāng)前工程師在C語言學(xué)習(xí)
    發(fā)表于 05-16 16:43

    程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》【完整資料】分享!

    現(xiàn)象,甚至成為一位閱讀程序者。 為了將實(shí)際開發(fā)過程中總結(jié)的有價(jià)值的技術(shù)應(yīng)用分享給大家,立功及其團(tuán)隊(duì)整理出《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》這本書,其內(nèi)
    發(fā)表于 08-31 16:20

    C語言入門教程-malloc函數(shù)free函數(shù)

    malloc函數(shù)free函數(shù) 假設(shè)您的程序在執(zhí)行過程中需要分配一定量的內(nèi)存。您可以隨時(shí)調(diào)用malloc
    發(fā)表于 07-29 11:58 ?4635次閱讀

    MicroBlaze:malloc 函數(shù)動態(tài)分配內(nèi)存溢出

    首先說明一點(diǎn),MicroBlaze C函數(shù)庫支持標(biāo)準(zhǔn)的內(nèi)存管理函數(shù),如malloc(),calloc(), free(),這些標(biāo)準(zhǔn)的C函數(shù)
    發(fā)表于 02-11 11:43 ?1873次閱讀
    MicroBlaze:malloc <b class='flag-5'>函數(shù)</b><b class='flag-5'>動態(tài)</b>分配<b class='flag-5'>內(nèi)存</b>溢出

    新書創(chuàng)作談:立功教授數(shù)十年之心血力作《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)

    近日,立功教授公開了數(shù)十年之心血力作《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》,此書在4月28日落筆,電子版已無償性分享到電子工程師與高校群體,在致遠(yuǎn)電子公眾號后臺回復(fù)關(guān)鍵字【
    發(fā)表于 05-08 09:32 ?2004次閱讀

    立功動態(tài)分布內(nèi)存——malloc()函數(shù)與calloc()函數(shù)

    立功教授數(shù)年之心血之作《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復(fù)【程序設(shè)計(jì)】即可在線閱讀。書本內(nèi)容公開
    的頭像 發(fā)表于 08-22 17:01 ?4810次閱讀

    算法與數(shù)據(jù)結(jié)構(gòu)——哈希表

    立功教授數(shù)年之心血之作《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》以及《面向第三章為算法與數(shù)據(jù)結(jié)構(gòu),本文為3.5 哈希表。
    的頭像 發(fā)表于 09-25 11:37 ?5498次閱讀
    算法與<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>——哈希表

    程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》——框架與重用

    立功教授數(shù)年之心血之作《程序設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)》以及《面向AMetal框架與接口的編程(上)》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復(fù)【編程】即可在線閱讀。書本內(nèi)容公開后
    的頭像 發(fā)表于 10-10 10:55 ?5453次閱讀
    《<b class='flag-5'>程序設(shè)計(jì)</b>與<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>》——框架與重用