在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    瀏覽量

    40135
  • 周立功
    +關注

    關注

    38

    文章

    130

    瀏覽量

    37642

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

    立功教授數年之心血之作《程序設計數據結構》以及《面向AMetal框架與接口的編程(上)》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復【編程】即可在線閱讀。
    的頭像 發表于 08-31 14:06 ?6908次閱讀
    <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 ?5633次閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    立功教授數年之心血之作《程序設計數據結構》以及《面向AMetal框架與接口的編程(上)》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復【編程】即可在線閱讀。書本內容公開后
    的頭像 發表于 10-10 10:55 ?5497次閱讀
    《<b class='flag-5'>程序設計</b>與<b class='flag-5'>數據結構</b>》——框架與重用
    主站蜘蛛池模板: 夜夜操天天爽| 日黄网站| 欧美视频一区二区三区在线观看| 五月天婷婷基地| a毛片基地免费全部香蕉| 免费黄色大片网站| 尻老逼| 久久精品视频免费观看| 日本特级淫片免费看| 午夜日韩精品| 色多多拼多多网站| 美女黄色在线看| 国产三级一区| 草色网| 天堂在线资源网| 天天色天天综合网| 4hu44四虎在线观看| 天天尻| 97天天做天天爱夜夜爽| 91大神精品视频| 最好看最新的中文字幕1| 婷婷综合 在线| 亚洲精品在线不卡| 717影院理论午夜伦八戒| 欧美性色xo影院69| 亚洲综合第一区| 啪啪激情综合| www在线视频观看| 免费任我爽橹视频在线观看| 色月丁香| 亚洲v视频| 欧美线人一区二区三区| 国产日本特黄特色大片免费视频| 黄色大片播放| 亚洲理论片| bt天堂在线观看| 国产一区二区三区夜色| 69精品在线观看| 色视频网站色视频播放| 久久精品1| 国产美女激情视频|