Linux下C編程:淺談動態記憶體

來源:互聯網
上載者:User

使用動態記憶體時需要使用者自己去申請資源和釋放資源。使用者可以隨時的分配所需空間,根據需要分配空間大小,並在最後釋放申請記憶體。

動態記憶體也存在隱患:在大型的項目當中管理申請的動態記憶體是很複雜的,以及釋放申請的記憶體有難想起的。在釋放動態記憶體時可能不止一個指標指向了該記憶體,所以釋放的時候是很容易出錯的。記憶體無法釋放就會造成記憶體泄露,這也就是為什麼伺服器要經常的每個一段時間重啟的原因。

記憶體管理操作:

分配記憶體函數:

#include <stdlib.h>              void *malloc(size_t size)              void *calloc(size_t nmemb,size_tsize)

函數malloc中size是分配記憶體的大小,以位元組為單位。

函數calloc中size是資料項目的大小,nmemb是資料項目的個數。所以分配記憶體大小為size*nmemb

malloc和calloc的最大區別是calloc會把申請到的內出初始化為0

調用成功都會返回分配記憶體的指標,調用失敗都返回NULL

記憶體的調整:

對於realloc(),函數原型是void* realloc(void *ptr,size_t  size),改變ptr所指記憶體地區的大小為size長度,size可以大於或小於原動態記憶體的大小,realloc通常是在原資料的基礎上調整動態記憶體的大小是,原資料內容不變。當size大於原來的資料,且在原來位置無法調整時,realloc會重新開闢記憶體,把原來的資料複製到這來。如果重新分配成功則返回指向被分配記憶體的指標,否則返回null 指標NULL。當記憶體不再使用時,應使用free()函數將記憶體塊釋放。有一點需要注意:當分配記憶體成功之後,應將原本的指標ptr=NULL,否則會形成野指標,可能造成系統崩潰。不論是以上那種方式申請記憶體,在申請記憶體之後,最終都要用free釋放空間,不然會造成記憶體流失。

如果ptr為NULL時realloc相當於malloc,如果size=0時相當於free

記憶體的釋放:

#include<stdlib.h>              voidfree(void *pr);

free用於釋放有malloc或calloc申請的動態記憶體。記憶體釋放後再去使用指標會發生錯誤。

執行個體如下:

#include <stdio.h>              #include <stdlib.h>                                 char *alloc_test();                                 main()              {                   char*p1,*p2;                   p1= alloc_test();                   p2= p1;                   printf("%s\n",p1);                   printf("%s\n",p2);                   free(p1);                   //free(p2);              }              char *alloc_test()              {                   char*pchar = malloc(20);                   strcpy(pchar,"helloalloc_test");                   returnpchar;              }

要把free(p2);注釋掉

否則會出錯,以為p1,p2同時指向了一個記憶體,通過p1釋放了記憶體塊,當通過p2再次釋放記憶體當然就出錯了。

pchar也指向了記憶體塊,但是又過p1釋放的記憶體,因為調用完alloc_test後pchar配釋放了當記憶體塊並沒有被釋放。

查看全套文章:http://www.bianceng.cn/Programming/C/201212/34807.htm

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。