1. 程式人生 > >嵌入式C語言入門——記憶體管理

嵌入式C語言入門——記憶體管理

記憶體管理

程式結構

  • 棧區
  • 堆區
  • 資料區
    • 未初始化的全域性,靜態資料
    • 初始化的全域性,靜態資料
  • 程式碼區

記憶體分配方式

  • 靜態分配
    • 程式碼區
    • 資料區
  • 動態分配
    • 棧區:系統分配
    • 堆區:程式設計師呼叫malloc系列函式分配

記憶體管理函式

malloc

void * malloc(size_t size);

malloc(配置記憶體空間)
表頭檔案:#include <stdlib.h>
函式引數:無符號整型資料
函式說明:malloc()在動態儲存區分配size位元組的連續空間
返回值:成功返回指向空間起始地址的指標,失敗返回NULL

realloc

void *realloc(void *ptr, size_t size)

relloc(變更已經配置的記憶體空間)
當需要擴大一塊記憶體空間時,realloc()試圖直接從堆上當前記憶體段後面的位元組中獲得更多的記憶體空間.

  • 如果能夠滿足,則返回原指標;
  • 如果當前記憶體段後面的空閒位元組不夠,那麼就使用堆上第一個能夠滿足這一要求的記憶體塊,將目前的資料複製到新的位置,而將原來的資料塊釋放掉。

引數ptr為先前由malloc、calloc和realloc所返回的記憶體指標,而引數size為新配置的記憶體大小。

calloc

void *calloc(size_t nmemb, size_t size)

calloc是malloc函式的簡單包裝,它的主要優點是把動態分配的記憶體進行初始化,全部清零。其操作及語法類似malloc()函式。

memset

void *memset(void *s, int c, size_t n)

將s中當前位置後面的n個位元組 用 c 替換並返回 s

free

void free(void *ptr);

void free(void *ptr);釋放原先申請的記憶體空間。

堆和棧的區別

管理方式不同

  • 棧編譯器自動管理
  • 堆空間申請釋放由程式設計師控制,容易產生記憶體洩露

空間大小不同

  • 棧向低地址拓展,是一塊連續的記憶體空間,棧頂的地址和棧的最大容量是系統預先設定好的
  • 堆是向高地址拓展,是不連續的記憶體區域

是否產生碎片

堆來講,頻繁的malloc/free(new/delete)勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低

增長方向不同

  • 堆的增長方向是向上的,即向著記憶體地址增加的方向
  • 棧的增長方向是向下的,即向著記憶體地址減小的方向

分配方式不同

  • 棧的分配和釋放是由編譯器完成的,棧的動態分配由alloca()函式完成
  • 堆程式malloc()動態審定分配,由free()函式釋放

分配效率不同

堆的效率比棧要低得多。