2016-09-22 70 views
1

我试图将一堆堆空间初始化为几个较小的固定大小块而不使用malloc。每个块指向下一个块。基本上,这是一个家庭滚动链表,不使用malloc。该结构看起来像这样:如何初始化和操作地址指针

/******** Memory Table Entry Data Structure**********/ 
typedef struct 
{ 
    ????? block_address; //<- What datatype should I use here? 
    void* next_free_block; 

}mem_table_entry_t; 

/******** Memory Table Data Structure**********/ 
typedef struct 
{ 
    mem_table_entry_t two_kib[8]; 

}mem_table_t; 

链接器通过一个外部变量_sys_memory,像这样使得堆的起始地址可供使用的程序:

extern void* _sys_memory; // Start of system memory 

在我的初始化程序, 我想制作一个指针,并指向与_sys_mem相同的地址。稍后,我想在2048年前增加指针,并将该值分配给下一个块的起始地址。我应该使用什么样的数据类型,以及如何操作它?

#include <stdint.h> 
#include "mem_manager.h" 

mem_table_t memory_table; 

void mem_initialize(void) 
{ 
    int block_count = 0; 

    void *dynamic_address; 

    dynamic_address = _sys_memory; 

    while(block_count < 8) 
    { 

     memory_table.two_kib[block_count].block_address = dynamic_address; 
     dynamic_address = (&dynamic_address + 0x800); 

     memory_table.two_kib[block_count].next_free_block = dynamic_address; 
     block_count++; 
    } 
+1

请告诉我究竟是什么 –

+0

@EdHeal的动机 - 这是一个大学课程的一部分。这个特殊的任务我们需要创建我们自己的malloc()和free()函数。我们使用的特定硬件具有80kB的堆空间,可以切割成各种固定大小。我的设计实现很少顺利...... lol – Darrell

+0

这个课程看起来很有趣,我的意思是实现你自己的malloc(),我真的很想看到你完成它! @达雷尔 –

回答

0

你的想法存在一些不明确之处(你没有给出关于实现malloc的想法的很多细节)。无论如何,你犯了一个错误,当你写

dynamic_address=(&dynamic_address+0x800) 

原因应该是:

dynamic_address = dynamic_address + 0x800 
+0

是的,我想的很多。当我提出你所做的更改时,会出现编译错误:“表达式必须是指向完整对象类型的指针。”思考? – Darrell