2013-07-10 254 views
0

我試圖創建自己的malloc,但我被困在一個點上。正如我們所知,我們必須將struct作爲可用空間中的元數據,如本圖中所述。 enter image description here將結構賦值給char數組

char heap_space[MEM_BUFFER];  
struct myblock 
    { 
     struct myblock *next; 
     struct myblock *prev; 
     int size; 
     char *buffer; 
    } 

我有我的heap_space這將是我的 「RAM」。現在我堅持一點: -

如何把我的結構分配myblockheap_space,一兩件事,我們應該記住每次當新的請求會來一次,該myblock的地方將被改變爲每分配(請求)空間。

+0

使用'reinterpret_cast'? – Mario

+0

它是C而不是C++ – Alexis

+0

@Alexis它被標記爲 – 2013-07-10 13:03:52

回答

1

我不知道理解你的問題,但你爲什麼不試着這麼做:

#define MEM_BUFFER 4096 
#define size_t unsigned int 


char heap_space[MEM_BUFFER] = {0}; 
struct myblock 
{ 
    struct myblock *next; 
    struct myblock *prev; 
    int size; 
    char *buffer; 
}; 

void *malloc(size_t size) 
{ 
    struct myblock *tmp = heap_space; 
    if (tmp != 0) // != 0 since NULL is in stdlib 
    while (tmp->next != 0) 
     tmp = tmp->next; 
    struct myblock *new_elem = tmp; //your question I guess 
    new_elem->prev = tmp; 
    new_elem->size = size; 
    new_elem->buffer = new_elem + sizeof(*new_elem); 
    new_elem->next = new_elem->buffer + new_elem->size; 
    return (new_elem->buffer); 
} 

int main() 
{ 
    char *str1 = malloc(10); 
    char *str2 = malloc(10); 

    strcpy(str1, "Hello"); 
    strcpy(str2, "World"); 

    printf("%s %s\n", str1, str2); 
} 

你應該想想你的記憶以不同的方式我想,你的heap_space裏面你可以有很多東西。

如果你不明白的東西,請問。

你也應該用void *和unsigned int的不是int

此外,你仍然有一些事情要做:

  • 檢查所需的尺寸可以在自己的數組中
  • 授如果您想要實現您的空間,請稍微多點空間 realloc
  • 實施您的免費功能

如果你在linux上,你應該嘗試使用brk/sbrk來代替你的'堆空間'。但是,最偉大的事情就是運行你自己的malloc(使用LD_PRELOAD)

+0

通過使用這種啓動方式,我收到了無限循環while while tmp-> next not null struct myblock * tmp = heap_space; //然後循環直到最後一個節點 struct myblock * new_elem = tmp-> next; – abidkhan303

+0

@ user1642500我已經改變了循環 – Alexis

+0

感謝@Alexis,你指導做好真的幫了頂部翅片我的解決方案,雖然我的計算策略是不同的,但我的主要問題理解的「公羊」初始化解決。 struct myblock * new_elem = tmp; new_elem-> prev = tmp;再次感謝您 – abidkhan303

0

如果是C++,你應該使用myblock *free_ptr = reinterpret_cast<myblock*>(heap_space);來初始化你免費的指針,然後初始化sizenextprevfree_ptrbuffer

在C中,您將使用常規的C風格轉換,struct myblock *free_ptr = (struct myblock*)heap_space;

+0

struct myblock * free_ptr =(struct myblock *)heap_space ;.通過使用這種方式,我只能在陣列的開始處有空間,但是如何在第二次或第三次調用時捕獲空間。如果你看圖中908字節是空閒的,如何在這個數組的位置上指定matadat – abidkhan303

+0

是的,你必須計算你想要的緩衝區的位置。我不是來做你的家庭作業,你必須弄清楚如何做數學。一旦你有一個指向緩衝區正確位置的char *,你可以使用我的回答(儘管有人顯然已經在另一個答案中做了你的功課,所以我不知道爲什麼我有時會打擾)。 –

+0

我很享受我的暑假,並利用我的空閒時間在電腦上學習新東西......作業?它從哪裏來的? – abidkhan303

0

「真實」的節目,您應該申報

struct myblock 
    { 
     struct myblock *next; 
     struct myblock *prev; 
     int size; 
     char buffer[0]; 
    } 

讓你的malloc將返回myblockvar.buffer