色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

周立功“程序設計與數據結構”:深度解剖動態分布內存的free()函數與realloc()函數

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


周立功教授數年之心血之作《程序設計與數據結構》,書本內容公開后,在電子行業掀起一片學習熱潮。經周立功教授授權,本公眾號特對本書內容進行連載,愿共勉之。

第一章為程序設計基礎,本文為1.9.3 free()函數和1.9.4 realloc()函數。

>>>>1.9.3free()函數

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

通常malloc()要與free()配套使用,當動態內存使用完畢時,如果不及時釋放的話,必然導致“內存泄露(即內存空間減少)”,進而影響程序的正常運行。釋放內存的free()函數原型如下:

void free(void *pointer);

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

char *pi = malloc(5);

free(pi);

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

即修改了pi指向的內存是嚴重的錯誤,因為程序對此內存失去了控制權。事實上,懸空指針是很難發現的,因為幾個指針可能指向相同的內存塊,在釋放內存塊后,全部的指針都懸空了。有了free()函數,也可以用malloc()在運行時分配一塊連續的內存空間,達到改變數組大小的目的。比如:

char * pi = malloc(5);

即變量pi指向已經在堆內分配的5個連續字節,好像聲明了一個有5個字符的數組一樣,顯然動態數組就是分配在“堆”上,用指針變量引用的數組。分配動態數組的步驟如下:

● 聲明一個指針變量用于保存數組變量首元素的地址;

調用malloc()為數組變量中的元素分配內存

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

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

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

和數組不同的是,當不再使用時,必須釋放內存。比如:

free(pi);

如果需要10個元素才夠用,那么應該先釋放原內存,然后再申請新內存。比如:

free(pi);

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

顯然,存放在原內存的數據不見了,為了保留原來的數據,需要再做些工作:

int *temp = pi; //讓temp指向原內存

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

memcpy(pi, temp, 5 * sizeof(int));//將原內存的數據拷貝到新內存

free(temp); //釋放原內存

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

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

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

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

1 #pragma once

2 void saferFree(void **pp);

程序清單1.50saferfreeh函數接口的實現(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宏調用saferFree函數,則可以省略類型轉換和傳遞指針的地址。即:

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

其調用形式如下:

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

NewSaferFree(pi);

>>>1.9.4realloc()函數

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

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

當調用realloc()函數時,point必須指向先前通過malloc、calloc或realloc的調用獲得的內存塊。size表示新分配內存的大小,以字節為單位。其作用是將pointer所指向的動態空間的大小改變為size,pointer的值不變。如果重新分配不成功,則返回NULL;如果通過malloc()已經獲得了動態空間,又不想改變其大小,則可以使用realloc()重新分配。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40195
  • 周立功
    +關注

    關注

    38

    文章

    130

    瀏覽量

    37711

原文標題:周立功:動態分布內存——free()函數與realloc()函數

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    程序設計數據結構立功數十年心血力作

    為了將實際開發過程中總結的有價值的技術應用分享給大家,立功及其團隊整理出《程序設計數據結構》這本書,其內容如同培訓講師的教案,是
    發表于 05-26 10:06 ?29次閱讀

    立功手把手教你學嵌入式編程:函數指針與指針函數的應用

    作者經常聽嵌入式軟件開發者說,“我幾乎不用函數指針……”。言下之意,那些復雜的語法似乎毫無用處,而實際上很多人根本沒有認識到其無窮的威力……本文將進入程序設計數據結構函數指針與指針
    的頭像 發表于 08-29 11:36 ?1.6w次閱讀

    立功教你學程序設計技術:做好軟件模塊的分層設計,回調函數要這樣寫

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

    立功教你學C語言編程與程序設計:這樣寫函數指針數組最好用

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

    立功程序設計數據結構》:字符串函數

    本文為程序設計基礎,本文為1.8.2 字符串常量第三點:字符串函數。
    的頭像 發表于 09-05 09:18 ?5652次閱讀

    立功教授談迭代器模式設計

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

    新書創作談:立功教授數十年之心血力作《程序設計數據結構

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

    【完整資料】《程序設計數據結構立功數十年心血力作

    ,是立功和團隊的讀書筆記和程序設計實踐的心得?!?b class='flag-5'>程序設計與數據結構》重點闡述了三大方向內容。C語言學習中的痛點:針對當前工程師在C語言學習
    發表于 05-16 16:43

    程序設計數據結構》【完整資料】分享!

    現象,甚至成為一位閱讀程序者。 為了將實際開發過程中總結的有價值的技術應用分享給大家,立功及其團隊整理出《程序設計數據結構》這本書,其內
    發表于 08-31 16:20

    C語言入門教程-malloc函數free函數

    malloc函數free函數 假設您的程序在執行過程中需要分配一定量的內存。您可以隨時調用malloc
    發表于 07-29 11:58 ?4659次閱讀

    MicroBlaze:malloc 函數動態分配內存溢出

    首先說明一點,MicroBlaze C函數庫支持標準的內存管理函數,如malloc(),calloc(), free(),這些標準的C函數
    發表于 02-11 11:43 ?1957次閱讀
    MicroBlaze:malloc <b class='flag-5'>函數</b><b class='flag-5'>動態</b>分配<b class='flag-5'>內存</b>溢出

    新書創作談:立功教授數十年之心血力作《程序設計數據結構

    近日,立功教授公開了數十年之心血力作《程序設計數據結構》,此書在4月28日落筆,電子版已無償性分享到電子工程師與高校群體,在致遠電子公眾號后臺回復關鍵字【
    發表于 05-08 09:32 ?2036次閱讀

    立功動態分布內存——malloc()函數與calloc()函數

    立功教授數年之心血之作《程序設計數據結構》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復【程序設計】即可在線閱讀。書本內容公開
    的頭像 發表于 08-22 17:01 ?4874次閱讀

    算法與數據結構——哈希表

    立功教授數年之心血之作《程序設計數據結構》以及《面向第三章為算法與數據結構,本文為3.5 哈希表。
    的頭像 發表于 09-25 11:37 ?5584次閱讀
    算法與<b class='flag-5'>數據結構</b>——哈希表

    程序設計數據結構》——框架與重用

    立功教授數年之心血之作《程序設計數據結構》以及《面向AMetal框架與接口的編程(上)》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復【編程】即可在線閱讀。書本內容公開后
    的頭像 發表于 10-10 10:55 ?5522次閱讀
    《<b class='flag-5'>程序設計</b>與<b class='flag-5'>數據結構</b>》——框架與重用
    主站蜘蛛池模板: 国产精品亚洲二线在线播放 | 麻豆传煤网站网址入口在线下载 | 无码爽死成人777在线观看网站 | 3344永久在线观看视频免费 | 嫩草电影网嫩草影院 | 男女一边摸一边做羞羞的事情免费 | 思思久99久女女精品 | 成人免费视频网站www | 国产麻豆精品传媒AV国产在线 | 亚洲免费视频日本一区二区 | 2021国产精品视频 | avove主播| 久久99热这里只频精品6 | 久章草一区二区 | 久久国语露脸精品国产 | 久热这里只有精品99国产6 | 国产精品单位女同事在线 | FREEHDXXXX学生妹 | 男人脱女人衣服吃奶视频 | 忘忧草在线社区WWW日本-韩国 | 亚洲无人区码二码三码区别图 | 九九色精品国偷自产视频 | 日本漫画之无彩翼漫画 | 亚洲破处女| 囯产少妇BBBBBB高潮喷水一 | 翘臀少妇被扒开屁股日出水爆乳 | 男人的天堂MV在线视频免费观看 | 国产毛多水多高潮高清 | 在线播放免费人成毛片视频 | a在线观看视频 | 中国老头oldday tv | 精品久久久久久久99热 | 动漫美女搞鸡 | 大伊人青草狠狠久久 | 年轻夫妇韩剧中文版免费观看 | 小莹的性荡生活 | 成年免费三级视频 | 国产三级精品三级男人的天堂 | 久久视热频这里只精品 | 超碰caoporen国产 | 国产精品久久久久久久AV下载 |