C語言中動態分配內存 malloc()、calloc()、realloc()用法詳解


  在程序的執行期間分配內存時,內存區域中的這個空間稱為堆(heap)。還有另一個內存

區域,稱為堆棧(stack),其中的空間分配給函數的參數和本地變量。在執行完函數后,存儲

參數和本地變量的內存空間就會釋放。堆中的內存是由程序員控制的
malloc():

    int *pNumber = (int*)malloc(100);               // 分配100字節內存
    int *pNumber = (int*)malloc(25*sizeof(int));        //存儲25個int值得內存

  類型轉換(int*)將函數返回的地址轉換成 int 類型的指針。malloc()返回 void 類型的指針,

void* 可以指向任何類型的數據,不能取消對 void 指針的引用,因為它指向未具體說明的對象。

如果因某種原因而不能分配請求的內存,malloc()會返回一個 NULL 指針。

 

用 if 語句檢查是否分配:

    int *pNumber = (int*)malloc(25*sizeof(int));

    if (!pNumber)
    {
        // 內存分配失敗的處理代碼
    }    

釋放動態分配的內存:

    free(pNumber);

    pNumber = NULL;

colloc() :
  與 malloc() 相比有兩個優點:
  (1)它把內存分配為給定大小的數組;
  (2)它初始化了所分配的內存,所有位都是 0。
 

    int *pNumber = (int*)calloc(75, sizeof(int));    
    // 分配了包含75個int元素的數組

  如果不能分配所請求的內存,返回值就是 NULL。

  可以讓編譯器執行類型轉換:  

    int *pNumber = calloc(75, sizeof(int));

 

擴展動態分配的內存 realloc() :

    realloc() 函數可以重用或擴展以前用 malloc()或 calloc()(或者realloc())分配的內存。
    realloc()的兩個參數:
    1)、一個是包含地址的指針,該地址以前由malloc()、colloc()或realloc()返回。
    2)、要分配的新內存的字節數。

 

  realloc()函數分配第二個參數指定的內存量,把第一個指針參數引用的、以前分

配的內存內容傳遞到新分配的內存中,傳遞的內容量是新舊內存中區域較小的那一個。
  realloc()函數返回一個指向新內存的void*指針,如果分配失敗,返回NULL。如果

第一個參數是NULL,就分配第二個參數指定的新內存,類似malloc()。
    
  realloc()保存了原內存區域的內容,且保存的量是新舊內存區域中較小的那個。

  如果新內存區域大於舊內存區域,新增的內存就不會初始化,而是包含垃圾值。
    
動態分配內存的基本原則 :

  * 避免分配大量的小內存塊。分配堆上的內存有一些系統開銷,所以分配許多小的內存塊
  比分配幾個大內存塊的系統開銷大。
      
  * 僅在需要時分配內存。只要使用完堆上的內存塊,就釋放它。
    
  * 總是確保釋放以分配的內存。在編寫分配內存的代碼時,就要確定在代碼的什么地方
  釋放內存。
      
   * 在釋放內存之前,確保不會無意中覆蓋堆上已分配的內存地址,否則程序就會出現內存
  泄漏。在循環中分配內存時,要特別小心。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM