詳解C語言動態內存分配

為什么使用動態內存分配

當你聲明數組時,你必須使用一個編譯時常量來指定數組的長度。但是,數組的長度常常在運行時才能確定,這是由于它所需要的內存空間取決于輸入的數據。

malloc和free

malloc用來從內存池中提取一塊合適的內存,并向改程序返回一個指向這塊內存的指針,這塊內存此時并沒有以任何方式進行初始化。
??free用來把前面動態分配的內存歸還內存池以供后續。
??這兩個函數的原型如下:

  void *malloc(sizze_t size);
  void *free(void *pointer);

1.maloc函數的參數就是需要分配的內存(字節)數,malloc分配的內存是連續的,當內存池中有sizet_size大小的連續內存時就返回指向該內存起始位置的指針,如沒有滿足條件的內存就返回NULL。
2.free函數的參數要么是NULL,要么是一個先前從malloc,calloc或realloc的返回值,向free傳遞一個NULL不起任何作用。
3.malloc返回的是一個void*類型的指針,其可以轉換成其它任何類型的指針。

calloc和recalloc

這兩個函數的原型如下:

void *calloc(size_t num_elements,size_t element_sizet );
void *recalloc(void *ptr,size_t new_size);

函數calloc的參數是所需要元素的個數和每個元素所需的字節數
??函數recalloc用于修改一個原先已經分配的內存的大小,使用該函數可以是一塊內存擴大或縮小。

1.calloc也用于分配內存和malloc的最大區別是前者在返回指向內存的指針前把它初始化為0
2.recalloc用于將一塊分配好的內存擴大縮小,當它用于擴大內存時以前這塊內存的內容依然保留,新增加的內存添加到原先內存的后面,用于縮小原來的內存時,該內存塊尾部的部分內存被拿掉,剩余部分的內存內容不變
3.recalloc用于重新分配內存時,如果原先的內存大小無法改變recalloc將分配另一塊正確大小的內存,并把原先那塊內存的內容復制到新塊上,因此,在使用recalloc后,不能使用指向原先內存的指針,而是應該使用recalloc所返回的新指針。

使用動態分配的內存

??舉例使用動態分配的內存

  int *pi;
  pi = malloc(100);
  if(pi == NULL)
  {
    printf("out of memory");
    exit(1);
  }

常見動態內存分配的錯誤

??動態內存分配常見的錯誤有以下幾種:

1.對NULL指針進行解應用操作;
2.對分配的內存進行操作時越界;
3.釋放并非動態分配的內存;
4.試圖釋放動態內存的一部分或是一塊動態內存被釋放后被繼續使用;

??如下代碼展示一種不容易出錯的動態內存分配:
??

                            /*alloc.h*/
  #include<stdio.h>
  #define malloc 
  #define MALLOC(num,type) (type*)alloc((num) * sizeof(type))
  extern void *alloc(size_t size);
                    /*alloc.c*/
  #include<stdio.h>
  #include"alloc.h"
  #undeine malloc

  void *alloc(size_t size)
  {
    void *new_mem;
    new_mem = malloc(size);
     if(new_mem == NULL)
    {
      printf("out of memory");
      exit(1);
    }
    return new_mem ;
  }
                    /*a_client.c*/
   #include"alloc.h"
  void function()
  {
    int *new_memory;
    new_memory = MALLOC(25,int);
  }

內存泄露

??分配內存但在使用完畢后不釋放內存將引起內存泄露

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容