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

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

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

3天內不再提示

realloc函數和free函數的實驗及注意事項

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:Mr_Li_ ? 2022-10-21 16:51 ? 次閱讀

realloc函數

realloc()函數可以重用或擴展以前用malloc()、calloc()及realloc()函數自身分配的內存。

函數原型:

extern void *realloc(void *mem_address, unsigned int newsize);
//指針名 = (數據類型*) realloc (要改變內存大小的指針名,新的大小)。
//新的大小一定要大于原來的大小,不然的話會導致數據丟失!
//如果newsize大小為0,那么釋放mem_address指向的內存,并返回NULL。

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

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

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

3、realloc()函數的第一個參數若為空指針,相當于分配第二個參數指定的新內存空間,此時等價于malloc()、calloc()或realloc()函數。

4、如果是將分配的內存擴大,則有以下3種情況:

1) 如果當前內存段后面有需要的內存空間,則直接擴展這段內存空間,realloc()將返回原指針。

2) 如果當前內存段后面的空閑字節不夠,那么就使用堆中的第一個能夠滿足這一要求的內存塊,將目前的數據復制到新的位置,并將原來的數據塊釋放掉,返回新的內存塊地址位置。

3) 如果申請失敗,將返回NULL,此時,原來的指針仍然有效。

注意事項:

1、第一個參數要么是空指針,要么是指向以前分配的內存。如果不指向以前分配的內存或指向已釋放的內存,結果就是不確定的。

2、 如果調用成功,不管當前內存段后面的空閑空間是否滿足要求,都會釋放掉原來的指針,重新返回一個指針,雖然返回的指針有可能和原來的指針一樣,即不能再次釋放掉原來的指針。

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

注意:這里原始內存中的數據還是保持不變的。當內存不再使用時,應使用free()等函數將內存塊釋放

#include
#include
int main()
{
  int i;
  int *t;


  int*pn = (int*)malloc(10 * sizeof(int));//這里只是申請10個int的空間
  t = pn;


  for (i = 0; i < 10; i++) {  //賦值
    pn[i] = i;
  }


          //如果將這里的數值改大就將有可能出現空閑空間不足,從而申請一塊新內存
  pn = (int*)realloc(pn, 20 * sizeof(int)); //多擴充10個int空間加上之前的就是一共20個int


  for (i = 10; i < 20; i++) {//再賦值  注意從第10個開始的
    pn[i] = i;
  }


  for (i = 0; i < 20; i++) {//輸出
    printf("%3d", pn[i]);
  }


  printf("
");
  printf("p=%p 
t=%p
", pn, t);//輸出地址




  free(pn);//釋放空間
  pn = NULL;//指針指空


  return 0;




}


如果申請空間的數值較小,原來申請的動態內存后面還有空余內存,系統將直接在原內存空間后面擴容
并返回原動態空間基地址;如果申請空間的數值較大,原來申請的空間后面沒有足夠大的空間擴容,
系統將重新申請一塊新的內存,并把原來空間的內容拷貝過去,原來空間OS自動free;如果申請空間的數值非常大,
系統內存申請失敗,返回NULL,原來的內存不會釋放。注意:如果擴容后的內存空間較原空間小,將會出現數據丟失,
如果直接realloc(p, 0);相當于free(p).

使用總結:

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

(2)realloc失敗的時候,原來的內存不改變,不會釋放也不會移動

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

(4)如果size為0,效果等同于free()。這里需要注意的是只對指針本身進行釋放,例如對二維指針**a,對a調用realloc時只會釋放一維,使用時謹防內存泄露。

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

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

malloc與free函數

malloc中文叫動態內存分配,用于申請一塊連續的指定大小的內存塊區域以void*類型返回分配的內存區域地址,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存,且分配的大小就是程序要求的大小。

函數原型:

void * malloc(size_t size);


在以前 malloc返回的是char型指針,新的ANSIC標準規定,該函數返回為void型指針,因此必要時要進行類型轉換。
它能向系統申請分配一個長度為num_bytes(或size)個字節的內存塊。


其作用是在內存的動態存儲區中分配一個長度為size的連續空間。當函數申請內存分配成功時,
此函數的返回值是分配區域的起始地址,或者說,此函數是一個指針型函數,返回的指針指向該分配域的開頭位置。
(它返回的是分配得到的內存的首字節地址),如果無法獲得符合要求的內存塊,malloc函數會返回空指針

size為要申請的空間大小,需要我們手動的去計算,如int *p = (int * )malloc(20*sizeof(int)),如果編譯器默認int為4字節存儲的話,那么計算結果是80 Byte,一次申請一個80 Byte的連續空間,并將空間基地址強制轉換為int類型,賦值給指針p,此時申請的內存值是不確定的。

malloc函數的實質體現在,它有一個將可用的內存塊連接為一個長長的列表的所謂 空閑鏈表的功能。

調用malloc函數時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內存塊。然后,將該內存塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的字節)。接下來,將分配給用戶的那塊內存傳給用戶,并將剩下的那塊(如果有的話)返回到連接表上。

調用free函數時,它將用戶釋放的內存塊連接到空閑鏈上。到最后,空閑鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那么空閑鏈上可能沒有可以滿足用戶要求的片段了。

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

#include
#include  


int main(void)
{
  int count, *array; /*count是一個計數器,array是一個整型指針,也可以理解為指向一個整型數組的首地址*/


  if ((array=(int *) malloc(10 * sizeof(int))) == NULL)//把類型強制轉換為int 申請內存空間 10個int的空間 
                   //一個int大小是sizeof(int)
  {
    printf("不能成功分配存儲空間。");
    exit(1); //強制結束程序
  }


  for (count = 0; count < 10; count++) { /*給數組賦值*/
    array[count] = count;
  }


  for (count = 0; count < 10; count++) { /*打印數組元素*/
    printf("%2d", array[count]);
  }
  return 0;


}

free函數:

free()是C語言中釋放內存空間的函數,通常與申請內存空間的函數malloc()結合使用,可以釋放由 malloc()、calloc()、realloc() 等函數申請的內存空間。

函數原型:

void free(void *ptr);
ptr-- 指針指向一個要釋放內存的內存塊,該內存塊之前是通過調用 
malloc、calloc 或 realloc 進行分配內存的。如果傳遞的參數是一個空指針,則不會執行任何動作。
該函數不返回任何值。

上面的例子:

#include
#include  


int main(void)
{
  int count, *array; /*count是一個計數器,array是一個整型指針,也可以理解為指向一個整型數組的首地址*/


  if ((array=(int *) malloc(10 * sizeof(int))) == NULL)//把類型強制轉換為int 申請內存空間 10個int的空間 
                              //一個int大小是sizeof(int)
  {
    printf("不能成功分配存儲空間。");
    exit(1); //強制結束程序
  }


  for (count = 0; count < 10; count++) { /*給數組賦值*/
    array[count] = count;
  }


  for (count = 0; count < 10; count++) { /*打印數組元素*/
    printf("%2d", array[count]);
  }
  
  free(array);  //剛剛沒有進行釋放內存


  return 0;


}


******free的重要性:*******


靜態內存的數量在編譯時是固定的,在運行期間也不會改變,
自動變量使用的內存數量在程序執行期間自動增加或減少,但是動態內存分配內存的數量只會增加,除非使用free函數進行釋放


它創建了指針array,并調用了malloc函數進行內存分配了(10* 4(int) )40個字節的內存,假設,如代碼注釋所示,
遺漏了free,當函數結束時,作為自動變量的指針array也會消失,但是它所指向的40個字節的內存卻仍然存在,
由于array指針已被銷毀,所以無法訪問這塊內存,它也不能被重復使用,因為代碼中沒有調用free函數釋放這塊內存,
如果是一個函數,當第二次調用它時,它又創建了array指針,并調用malloc分配40個字節的內存,第一次調用的40個字節的內存已不可用,
所以malloc函數分配了另外的內存,當函數結束時該內存也無法被訪問和再使用,如果循環要進行1000次,那么每一次的調用都會分配內存,
持續增加,實際上,等不到程序結束,內存早已被耗盡,這類問題被稱為內存泄漏,所以 為防止這類問題的發生,
必須要在動態內存分配函數后加上free函數釋放內存。

總結:

malloc 必須要由我們計算字節數,并且在返回后強行轉換為實際類型的指針。另外有一點不能直接看出的區別是,malloc 只管分配內存,并不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的

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

通常,malloc函數要和free函數一起配對使用,free函數的參數是之前mallloc函數返回的地址(指針),該函數釋放之前malloc函數分配的內存,因此,動態內存分配的存儲期是從動態內存分配函數malloc(或其他)到f調用ree函數釋放內存為止,涉嫌malloc和free函數管理著一個內存池。

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

審核編輯:郭婷


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

    關注

    38

    文章

    7484

    瀏覽量

    163770
  • 函數
    +關注

    關注

    3

    文章

    4329

    瀏覽量

    62575

原文標題:【零基礎學C語言】內存知識總結:realloc函數和free函數

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    多層板埋孔設計注意事項

    多層板埋孔設計注意事項
    的頭像 發表于 12-20 16:06 ?95次閱讀

    PCBA生產注意事項

    ? ?PCBA生產注意事項。 長按識別二維碼關注[現代電子裝聯工藝技術]訂閱號,開啟我們共同的學習之旅 end
    的頭像 發表于 11-15 17:04 ?368次閱讀
    PCBA生產<b class='flag-5'>注意事項</b>

    如何為住宅配置靜態IP:步驟與注意事項

    為住宅配置靜態IP地址,通常涉及以下步驟和注意事項
    的頭像 發表于 10-24 08:02 ?224次閱讀

    脈沖式充電器的使用注意事項

    脈沖式充電器的使用注意事項主要包括以下幾個方面: 一、安全注意事項 用電安全 :在充電過程中,應始終保持警惕,注意用電安全,避免觸電和短路等危險情況的發生。 防火防災 :避免在易燃易爆物品附近進行
    的頭像 發表于 09-26 16:05 ?772次閱讀

    繞線電感定制的注意事項

    電子發燒友網站提供《繞線電感定制的注意事項.docx》資料免費下載
    發表于 09-20 11:24 ?0次下載

    共模電感定制的注意事項

    電子發燒友網站提供《共模電感定制的注意事項.docx》資料免費下載
    發表于 09-04 11:47 ?0次下載

    LiFePO4設計注意事項

    電子發燒友網站提供《LiFePO4設計注意事項.pdf》資料免費下載
    發表于 09-03 09:24 ?0次下載
    LiFePO4設計<b class='flag-5'>注意事項</b>

    函數信號發生器怎么調頻率

    函數信號發生器是一種常用的電子測試設備,它能夠產生各種波形、頻率和幅度的信號,廣泛應用于科研、教學、生產和維修等領域。在使用函數信號發生器時,調整頻率是其中一個非常重要的步驟。本文將詳細介紹函數信號發生器如何調整頻率,以及相關的
    的頭像 發表于 05-20 18:23 ?1615次閱讀

    函數發生器的使用方法和注意事項

    函數發生器,作為電子測試和測量領域的重要工具,廣泛應用于生產測試、儀器維修、實驗室研究以及通訊等多個科技領域。它的主要功能是產生各種波形、頻率和幅度的信號,以滿足不同的測試需求。本文將詳細介紹函數發生器的使用方法及
    的頭像 發表于 05-15 11:44 ?1833次閱讀

    FMD LINK 使用注意事項

    電子發燒友網站提供《FMD LINK 使用注意事項.pdf》資料免費下載
    發表于 05-06 10:11 ?0次下載

    函數多層調用的主要注意事項分析

    應用方案設計中,開發者經常會碰到某個子函數需要多次多級調用的情況。
    的頭像 發表于 03-27 15:36 ?850次閱讀
    子<b class='flag-5'>函數</b>多層調用的主要<b class='flag-5'>注意事項</b>分析

    EMI / Safety觀念簡介及注意事項

    電子發燒友網站提供《EMI / Safety觀念簡介及注意事項.ppt》資料免費下載
    發表于 02-28 09:45 ?1次下載

    浪涌抑制器的應用及注意事項

    浪涌抑制器的應用及注意事項?|深圳比創達電子
    的頭像 發表于 01-19 09:55 ?730次閱讀
    浪涌抑制器的應用及<b class='flag-5'>注意事項</b>?

    測速電機: 常見6大注意事項

    測速電機: 常見6大注意事項!測速電機是一種用于測量物體運動速度的設備,廣泛應用于工業生產和科學研究中。測速電機常見的6大注意事項以確保安全和準確性。
    的頭像 發表于 01-11 10:53 ?481次閱讀
    測速電機: 常見6大<b class='flag-5'>注意事項</b>

    DC電源模塊有哪些注意事項和使用技巧?

    DC電源模塊有哪些注意事項和使用技巧?
    的頭像 發表于 12-25 13:59 ?605次閱讀
    DC電源模塊有哪些<b class='flag-5'>注意事項</b>和使用技巧?
    主站蜘蛛池模板: 国产精品久久久久影院色老大| 国产精品v欧美精品v日韩| 国产成人免费全部网站| 好想被狂躁A片免费久99| 老司机福利在 线影院| 射90黑b丝女| 综合伊人久久| 国产盗摄一区二区| 毛片内射久久久一区| 翁止熄痒禁伦短文合集免费视频| 中国老太性色xxxxxhd| 国产成人在线播放| 美女屁股软件| 亚洲成人免费在线观看| blacked黑人战小美女| 花蝴蝶在线直播观看| 日韩精品亚洲专区在线影院| 一品道门免费高清视频| 国产白浆视频在线播放| 麻豆精选2021| 亚洲一卡二卡三卡四卡无卡麻豆| 俄罗斯videosbest8| 男男肉肉互插腐文| 亚洲欧美一区二区三区导航| 成人免费视频网站www| 老版香蕉版下载| 亚洲精品国产熟女久久久| 成人午夜剧场| 免费视频国产| 亚洲综合久久一本伊伊区| 国产AV综合手机在线观看| 免费无码又爽又黄又刺激网站| 亚洲欧洲日韩视频在钱| 国产二级一片内射视频播放| 欧美人妇无码精品久久| 曰韩一本道高清无码av| 国产精品丰满人妻AV麻豆| 让人爽到湿的小黄书| 97超碰射射射| 久久天天综合| 亚洲色欲色欲综合网站|