用雜湊表加連結串列實現動態malloc
阿新 • • 發佈:2019-01-26
///////////////////////////////////////////////////////////////////
////在指定的Free雜湊表項中查詢滿足size大小的記憶體並返回相應的地址
void *find_malloc(Node *head, size_t size) {
size_t fsize = 0;
while (head) {
fsize = head->_size; //獲取當前可用記憶體fsize
if (fsize >= size) { //如果當前可用記憶體fsize滿足使用者需求size
head->_state = '1'; //標識當前記憶體為佔用
pushUsed(&head); //將當前佔用的記憶體插入到Used雜湊表中
delFree(&head); //獎當前佔用的記憶體從Free雜湊表中刪除
if (fsize - size > NODESIZE) { //如果當前可用記憶體fsize超過使用者需求size並且剩餘記憶體能夠組織新記憶體塊
head->_size = size; //設定前面佔用記憶體大小為使用者需求size
Node *pNode = (Node *)((char *)head + NODESIZE + size); //建立新記憶體塊
insertMain(&head, &pNode, fsize - size - NODESIZE); //將新記憶體塊插入到主連結串列中
insertFree(&pNode); //將新空閒記憶體插入到Free雜湊表中
}
return (void *)((char *)head + NODESIZE); //返回記憶體實際可用地址
}
head = head->_free;
}
return NULL;
}
////在指定的Free雜湊表項中查詢滿足size大小的記憶體並返回相應的地址
void *find_malloc(Node *head, size_t size) {
size_t fsize = 0;
while (head) {
fsize = head->_size; //獲取當前可用記憶體fsize
if (fsize >= size) { //如果當前可用記憶體fsize滿足使用者需求size
head->_state = '1'; //標識當前記憶體為佔用
pushUsed(&head); //將當前佔用的記憶體插入到Used雜湊表中
delFree(&head); //獎當前佔用的記憶體從Free雜湊表中刪除
if (fsize - size > NODESIZE) { //如果當前可用記憶體fsize超過使用者需求size並且剩餘記憶體能夠組織新記憶體塊
head->_size = size; //設定前面佔用記憶體大小為使用者需求size
Node *pNode = (Node *)((char *)head + NODESIZE + size); //建立新記憶體塊
insertMain(&head, &pNode, fsize - size - NODESIZE); //將新記憶體塊插入到主連結串列中
insertFree(&pNode); //將新空閒記憶體插入到Free雜湊表中
}
return (void *)((char *)head + NODESIZE); //返回記憶體實際可用地址
}
head = head->_free;
}
return NULL;
}