記憶體動態分配

2022-08-31 01:36:10 字數 1571 閱讀 2206

在微控制器中由於記憶體資源緊張,不可能給每個任務分配專有的記憶體區,尤其是涉及到通訊模組的程式,對記憶體的使用更是敏感。為此開發乙個簡單的記憶體管理庫,對以後的開發還是有著不小的幫助的。

功能實現:記憶體動態分配、記憶體動態釋放、記憶體碎片**

heap.c

// 記憶體劃分:申請的一塊記憶體分為兩部分,一部分用於儲存鍊錶結構體,另一部分給使用者使用

// 記憶體管理:鍊錶不存在頭節點和尾節點,理論上在內存在可以存在無數個節點,通過空閒標誌位來識別該記憶體塊是否可用

#include "heap.h"

#define heap_true   1

#define heap_false   0

#pragma pack(push, 1)

typedef struct _sheaplist_t

sheaplist_t;

#pragma pack(pop)

// 申請乙個記憶體塊,作為基礎記憶體

static unsigned char heap[heap_total_size];

// 記憶體申請(注:函式不可重入)

void *pmalloc(unsigned int size)

if(size > 0)

}pnode = pnode->pnext;

}// 找到了符合條件的記憶體塊就進行分配,否則就直接返回null

if(pnode != null)

else

return pnode->penter; // 返回使用者記憶體入口位址}}

return null;

}// 記憶體釋放

void pfree(void *p)

// 因為記憶體塊都是按位址順序排列在鍊錶中的(空閒記憶體塊和使用者記憶體塊在同乙個鍊錶),

// 因此釋放時只需合併記憶體塊就可以了

if(pnode->pnext != null)

}if(pnode->plast != null)

}pnode->isfree = heap_true; // 不管記憶體塊是否合併成功,最後都要將記憶體塊設定為空閒狀態

}heap.h

#ifndef __heap_h

#define __heap_h

// define null pointer value

#ifndef null

#ifdef __cplusplus

#define null 0

#else

#define null ((void *)0)

#endif

#endif

// 模組功能:微控制器記憶體動態管理,支援記憶體碎片**

// 動態管理的記憶體大小,單位:位元組

#define heap_total_size (10 * 1024) // 10kb

// 記憶體申請(注:函式不可重入)

void *pmalloc(unsigned int size);

// 記憶體釋放(帶有記憶體碎片**機制)

void pfree(void *p);

#endif

記憶體動態分配

陣列的元素儲存於記憶體中連續的位置上。當乙個陣列被宣告時,它所需要的內存在編譯時就被分配。但是,你也可以使用動態記憶體分配在執行時為它分配記憶體。malloc所分配的是一塊連續的記憶體。例如,如果請求它分配100個位元組的記憶體,那麼它實際分配的記憶體就是100個連續的位元組,並不會分開位於兩塊或多...

動態分配記憶體

動態記憶體分配即分配記憶體大小在執行時才確定,一般在堆中分配。c語言動態記憶體分配相關的函式。include void malloc size t size malloc的使用比較直接,乙個成功的malloc呼叫返回分配的size大小的記憶體的指標。失敗時返回null並將錯誤 置為enomem。教材...

動態分配記憶體

動態分配記憶體 動態分配記憶體也可以分配儲存區,這種方式可以在程式執行的時候臨時決定分配的儲存區大小 為了管理動態分配的記憶體,就需要使用一組標準函式 為了使用這些標準函式,需要包含stdlib.h標頭檔案 malloc 函式可以動態分配一組連續的位元組 這個函式需要乙個整數型別引數表示分配的位元組...